Set查找效率显著高于普通数组,因其基于哈希表实现,has()平均时间复杂度为O(1),而数组includes等方法为O(n);但Set不支持索引访问,仅适用于存在性判断。

Set 在查找效率上明显优于普通数组,核心原因是底层实现机制不同。
查找时间复杂度差异
普通数组使用 includes、indexOf 或循环遍历判断是否存在某个值,每次查找都要逐个比对,时间复杂度是 O(n);多次查找就是 O(n²)。而 Set 内部基于哈希表(或类似优化结构)实现,has() 方法的平均查找时间复杂度接近 O(1)——无论集合有多大,判断一个值是否存在几乎都是常数时间。
实际表现对比
假设有一个包含 10 万个数字的列表:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 用数组查一个值:最坏可能要比较 10 万次;
- 用 Set 查同一个值:通常 1~3 次哈希计算就能确认是否存在。
尤其在需要高频判断成员资格(比如过滤、去重、权限校验)时,这种差距会非常明显。
注意:优势只体现在“存在性判断”
Set 的高效不适用于所有操作:
- 它不支持按索引取值(没有
set[0]),所以不适合随机访问场景; - 查找快,但遍历或转成数组仍需 O(n);
- 对象类型仍按引用比较,两个内容相同的对象不会被识别为重复,这点和数组一样需额外处理。
简单验证方式
你可以快速测一下:
const arr = Array.from({length: 100000}, (_, i) => i);
const set = new Set(arr);
console.time('array includes');
arr.includes(99999);
console.timeEnd('array includes'); // 通常零点几毫秒到几毫秒
console.time('set has');
set.has(99999);
console.timeEnd('set has'); // 通常不到 0.1 毫秒

















