includes方法更直接判断元素存在性,语义清晰、代码简洁;支持NaN识别和负索引起始位置,使用SameValueZero算法,推荐在仅需判断存在性时优先使用。

includes 方法比 indexOf 更直接地判断元素是否存在于数组中,无需比较返回值是否为 -1,语义更清晰、代码更简洁。
语法差异一目了然
indexOf 返回匹配元素的索引(找不到时为 -1),需手动判断:
const arr = [1, 2, 3, 4];
if (arr.indexOf(3) !== -1) {
console.log('存在');
}
includes 直接返回布尔值,语义即“是否包含”:
const arr = [1, 2, 3, 4];
if (arr.includes(3)) {
console.log('存在');
}
支持 NaN 和负索引起始位置
includes 能正确识别 NaN,而 indexOf 不能(因为 NaN !== NaN):
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
[NaN].includes(NaN); // true [NaN].indexOf(NaN); // -1
它还支持从指定位置开始搜索(类似 indexOf(searchElement, fromIndex)):
[1, 2, 3, 2, 4].includes(2, 2); // true(从索引 2 开始找,找到第二个 2) [1, 2, 3, 2, 4].includes(2, 3); // true(从索引 3 开始,仍能找到) [1, 2, 3, 2, 4].includes(2, 4); // false(从索引 4 开始,后面无 2)
注意严格相等与对象引用
includes 使用 SameValueZero 算法(与 === 基本一致,但 0 和 -0 视为相等,NaN 自身相等):
-
[0, -0].includes(-0)→true -
[NaN].includes(NaN)→true - 对对象或数组,仍比较引用而非内容:
[{a:1}].includes({a:1})→false
实际使用建议
- 仅需判断“是否存在”时,优先用
includes(),可读性高、意图明确 - 需要获取元素位置时,才用
indexOf()或findIndex() - 处理可能含
NaN的数据时,includes()是更可靠的选择 - ES2016+ 环境可放心使用;如需兼容旧环境,可用 Babel 转译或简单 polyfill

















