正在加载...

数组查找

stamps 里依次放着 oak、elm、再一枚 oak,这一页抽屉的大小保持不变,因为你要查的是某一个值,而不是把每一格都走一遍。

问那枚邮票

上一页里 forEach 走过每一首歌,调用本身回来的是 undefined。这里你只点一枚邮票的名字,抽屉既不变长也不变短。

四种答案的形状

读数字之前,先想清楚你要的是哪一种答案。然后再按那个形状去选方法。

📊 每种查找交还什么

方法 你问的事 交还的值 没有时
indexOf 第一次对上的格子 一个下标 -1
lastIndexOf 最后一次对上的格子 一个下标 -1
includes 这个值在不在 true 或 false false
find 条件成立的那一项 该项本身 undefined

格子编号来自 indexOf 和 lastIndexOf,而 includes 和 find 不会把格子编号交到你手里。

前面那枚

问第一枚 oak 坐在哪一格。心里准备好数字 0。

第一枚 oak

javascript
let stamps = ["oak", "elm", "oak"];
let slot = stamps.indexOf("oak");
console.log(slot);

日志里是 0,后面那枚 oak 不进这个结果。

没有的 pine

javascript
let stamps = ["oak", "elm", "oak"];
let slot = stamps.indexOf("pine");
console.log(slot);
console.log(stamps.length);

pine 从一开始就没放进去,日志里是 -1。长度仍是 3,所以没找到并不等于删掉一枚邮票。

后面的 oak

javascript
let stamps = ["oak", "elm", "oak"];
let slot = stamps.lastIndexOf("oak");
console.log(slot);

日志里是 2,也就是抽屉末尾那枚 oak,不是最前面的那枚。

有还是没有

javascript
let stamps = ["oak", "elm", "oak"];
console.log(stamps.includes("elm"));
console.log(stamps.includes("pine"));

elm 打出 true。pine 打出 false。这个 false 不是 -1。

邮票本身

javascript
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。

页面演示 — 格子或 missing

html
<!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。

自己查一遍

这六项检查都在同一个抽屉上做。

  1. 记下第一枚 oak 的格子,预期是 0
  2. 记下 pine 的查找,预期是 -1,长度仍是 3
  3. 记下最后一枚 oak 的格子,预期是 2
  4. 分别记下 elm 在不在、pine 在不在
  5. 用 find 取出 elm,也取出 pine,把字符串和 undefined 放在一起看
  6. 读段落,改查 pine,再刷新

容易搅在一起

这六件事不要当成一回事。

  • 不要把 -1 当成可以读取的格子
  • 不要把 true 或 false 读成格子编号
  • 不要指望 find 为 elm 交还 1
  • 只想要有或没有时,不要去用 forEach
  • 不要把另一种类型或另一种大小写当成对上了
  • 不要用 if (slot) 判断成功,因为 0 是一次真正的命中

带走这些差别

把下面这些差别分开记。

  • 第一次对上或 -1,来自 indexOf
  • 最后一次对上或 -1,来自 lastIndexOf
  • 有或没有,来自 includes
  • 邮票本身或 undefined,来自 find
  • 没找到不会改掉长度
  • 下一页讲日期和时间

🧠 测试您的知识

准备开始

测试您的知识

通过这个互动测验挑战自己,看看你对这个主题的理解程度如何

❓
8
问题
🎯
70%
及格要求
♾️
∞
时间
🔄
∞
尝试次数

📝 说明

  • 仔细阅读每个问题
  • 为每个问题选择最佳答案
  • 您可以随时重新参加测验
  • 您的进度将显示在顶部