includes方法不能直接去重,仅用于判断值是否存在;需配合循环手动构建新数组实现基础去重,适用于基本类型,对象等引用类型需其他策略。

includes 方法本身**不能直接实现数组去重**,它只是用于判断某个值是否存在于数组中(返回 true 或 false)。但你可以**配合 includes 和循环逻辑**,手动构建一个无重复的新数组。这是理解去重原理的常用方式,适合初学者掌握思路。
用 includes 辅助手动去重(基础实用)
核心思路:遍历原数组,对每个元素,检查它是否**已经在新数组中出现过**;如果没出现过,就 push 进去。
示例代码:
const arr = [1, 2, 2, 3, 4, 4, 5];
const unique = [];
for (const item of arr) {
if (!unique.includes(item)) {
unique.push(item);
}
}
console.log(unique); // [1, 2, 3, 4, 5]
注意 includes 的局限性(关键细节)
includes 使用的是**严格相等(SameValueZero)比较**,对基本类型(数字、字符串、布尔值)没问题,但对对象、数组等引用类型会失效:
-
[1, 2].includes([1, 2])→false(两个数组是不同引用) -
{a:1}.includes({a:1})→ 语法错误(includes是数组方法,对象不能调用)
所以该方法**只适用于简单数据类型**的去重。如需处理对象数组,应改用 find + 属性比对,或用 Map/Set 配合序列化等策略。
更推荐的现代写法(简洁高效)
虽然题目问 includes,但实际开发中更推荐以下方式:
-
Set 去重(最常用):
[...new Set(arr)]—— 简洁、高效、兼容性好(ES6+) -
filter + indexOf:
arr.filter((item, index) => arr.indexOf(item) === index)—— 不依赖额外变量,语义清晰 -
reduce:
arr.reduce((acc, cur) => acc.includes(cur) ? acc : [...acc, cur], [])—— 函数式风格,但性能略低(includes在每次迭代都遍历累积数组)
小结:includes 在去重中的定位
它是一个**辅助判断工具**,不是去重的“解决方案”本身。理解它如何配合循环使用,有助于掌握底层逻辑;但在真实项目中,优先选择 Set 或经过优化的方法,兼顾可读性与性能。不复杂但容易忽略。











