推荐答案
- Set 是一种集合数据结构,允许存储任何类型的唯一值,无论是原始值还是对象引用。Set 中的值是无序的,且每个值只能出现一次。
- WeakSet 是一种特殊的集合,只能存储对象引用,且这些引用是弱引用。WeakSet 中的对象是弱持有的,意味着如果没有其他引用指向该对象,它会被垃圾回收机制自动回收。
本题详细解读
Set 的特点
- 存储类型:Set 可以存储任何类型的值,包括原始值(如字符串、数字等)和对象引用。
- 唯一性:Set 中的值是唯一的,重复的值会被自动忽略。
- 强引用:Set 中的值是通过强引用持有的,即使没有其他引用指向该值,它也不会被垃圾回收。
- 可迭代:Set 是可迭代的,可以使用
for...of循环或forEach方法遍历其中的值。 - 大小:可以通过
size属性获取 Set 中元素的数量。
WeakSet 的特点
- 存储类型:WeakSet 只能存储对象引用,不能存储原始值。
- 弱引用:WeakSet 中的对象是弱持有的,如果没有其他引用指向该对象,它会被垃圾回收机制自动回收。
- 不可迭代:WeakSet 不可迭代,没有
forEach方法,也不能直接获取其大小。 - 用途:WeakSet 通常用于存储对象的临时引用,避免内存泄漏。
使用场景
- Set:适用于需要存储唯一值的场景,如去重、集合运算等。
- WeakSet:适用于需要临时存储对象引用且不希望影响垃圾回收的场景,如缓存、事件监听器等。
示例代码
// www.javascriptcn.com code example
// Set 示例
const set = new Set();
set.add(1);
set.add('hello');
set.add({}); // 可以存储对象
console.log(set.size); // 3
// WeakSet 示例
const weakSet = new WeakSet();
const obj = {};
weakSet.add(obj);
// weakSet.add(1); // 报错,WeakSet 只能存储对象
console.log(weakSet.has(obj)); // true通过以上对比,可以清晰地看出 Set 和 WeakSet 的主要区别在于存储类型、引用强度以及是否可迭代等方面。