数组查找
stamps 里依次放着 oak、elm、再一枚 oak,这一页抽屉的大小保持不变,因为你要查的是某一个值,而不是把每一格都走一遍。
问那枚邮票
上一页里 forEach 走过每一首歌,调用本身回来的是 undefined。这里你只点一枚邮票的名字,抽屉既不变长也不变短。
四种答案的形状
读数字之前,先想清楚你要的是哪一种答案。然后再按那个形状去选方法。
📊 每种查找交还什么
| 方法 | 你问的事 | 交还的值 | 没有时 |
|---|---|---|---|
indexOf |
第一次对上的格子 | 一个下标 | -1 |
lastIndexOf |
最后一次对上的格子 | 一个下标 | -1 |
includes |
这个值在不在 | true 或 false |
false |
find |
条件成立的那一项 | 该项本身 | undefined |
格子编号来自 indexOf 和 lastIndexOf,而 includes 和 find 不会把格子编号交到你手里。
前面那枚
问第一枚 oak 坐在哪一格。心里准备好数字 0。
let stamps = ["oak", "elm", "oak"];
let slot = stamps.indexOf("oak");
console.log(slot);
日志里是 0,后面那枚 oak 不进这个结果。
let stamps = ["oak", "elm", "oak"];
let slot = stamps.indexOf("pine");
console.log(slot);
console.log(stamps.length);
pine 从一开始就没放进去,日志里是 -1。长度仍是 3,所以没找到并不等于删掉一枚邮票。
let stamps = ["oak", "elm", "oak"];
let slot = stamps.lastIndexOf("oak");
console.log(slot);
日志里是 2,也就是抽屉末尾那枚 oak,不是最前面的那枚。
let stamps = ["oak", "elm", "oak"];
console.log(stamps.includes("elm"));
console.log(stamps.includes("pine"));
elm 打出 true。pine 打出 false。这个 false 不是 -1。
let stamps = ["oak", "elm", "oak"];
let hit = stamps.find(function (name) {
return name === "elm";
});
console.log(hit);
let miss = stamps.find(function (name) {
return name === "pine";
});
console.log(miss);
第一行是字符串 elm,第二行是 undefined。没有任何邮票通过的检验,并不是格子编号。
把格子写到页面上
把第一枚 oak 的格子变成文字,如果查找结果是 -1,就在段落里显示单词 missing。
<!DOCTYPE html>
<html>
<head>
<title>array-search — page</title>
</head>
<body>
<p id="slot">…</p>
<script>
let stamps = ["oak", "elm", "oak"];
let slot = stamps.indexOf("oak");
let line = "missing";
if (slot !== -1) {
line = String(slot);
}
let box = document.getElementById("slot");
box.textContent = line;
</script>
</body>
</html>
段落显示 0。把查找改成 pine,再刷新页面。这时你会看到单词 missing。
自己查一遍
这六项检查都在同一个抽屉上做。
- 记下第一枚 oak 的格子,预期是 0
- 记下 pine 的查找,预期是 -1,长度仍是 3
- 记下最后一枚 oak 的格子,预期是 2
- 分别记下 elm 在不在、pine 在不在
- 用 find 取出 elm,也取出 pine,把字符串和 undefined 放在一起看
- 读段落,改查 pine,再刷新
容易搅在一起
这六件事不要当成一回事。
- 不要把 -1 当成可以读取的格子
- 不要把 true 或 false 读成格子编号
- 不要指望 find 为 elm 交还 1
- 只想要有或没有时,不要去用 forEach
- 不要把另一种类型或另一种大小写当成对上了
- 不要用 if (slot) 判断成功,因为 0 是一次真正的命中
带走这些差别
把下面这些差别分开记。
- 第一次对上或 -1,来自 indexOf
- 最后一次对上或 -1,来自 lastIndexOf
- 有或没有,来自 includes
- 邮票本身或 undefined,来自 find
- 没找到不会改掉长度
- 下一页讲日期和时间
🧠 测试您的知识
测试您的知识
通过这个互动测验挑战自己,看看你对这个主题的理解程度如何
📝 说明
- 仔细阅读每个问题
- 为每个问题选择最佳答案
- 您可以随时重新参加测验
- 您的进度将显示在顶部