JavaScript 中 Set 和 Array 的核心区别在于唯一性、顺序性和方法设计。Set 是唯一值集合,Array 是有序列表。
一、Set 与 Array 核心区别
二、关键差异示例
1. 唯一性处理
constarr=[1,2,2,3];constset=newSet([1,2,2,3]);console.log(arr);// [1, 2, 2, 3]console.log([...set]);// [1, 2, 3]2. 存在性检查性能
// Set 的 has() 是 { O(1): 常数时间,无论数据有多少,操作时间基本固定 },set.has(2);// true,速度快// Array.includes() 是{O(n) 线性时间 } 就像一本本翻书,元素越多越慢arr.includes(2);// true,数组大时较慢,最坏情况:100个元素,要检查到第100个,还能发现。3. 转换技巧
// 数组去重constunique=[...newSet(array)];// Set 转数组constarrayFromSet=Array.from(set);WeakSet 与 Set 核心区别
Set 可以存储任何类型,WeakSet只能存储对象。WeakSet是弱引用,不影响垃圾回收。
1、存储限制
// Set 可以存储任何类型constset=newSet();set.add(1);// ✅ 数字set.add("hello");// ✅ 字符串set.add({});// ✅ 对象set.add(Symbol());// ✅ Symbolset.add(null);// ✅ nullset.add(undefined);// ✅ undefinedset.add([1,2,3]);// ✅ 数组set.add(function(){});// ✅ 函数// WeakSet 只能存储对象constweakSet=newWeakSet();weakSet.add({});// ✅ 对象weakSet.add([]);// ✅ 数组(也是对象)weakSet.add(newDate());// ✅ Date 对象weakSet.add(function(){});// ✅ 函数(也是对象)weakSet.add(1);// ❌ TypeError: Invalid value used in weak setweakSet.add("hello");// ❌ TypeError: Invalid value used in weak setweakSet.add(Symbol());// ❌ TypeError: Invalid value used in weak setweakSet.add(null);// ❌ TypeError: Invalid value used in weak set