Appearance
Set、WeakSet、Map、WeakMap
Set
Set 特点是值唯一和无序。类似于数组,但是成员的值都是唯一的,没有重复的值,遍历的话是插入顺序。Array.from(new Set([1,2,3,'1',1,2,3,1])) 依赖值唯一的特性实现去重。
重点
- Set 加入的值不会进行类型转换
对于 new Set("1" , 1) 其结果是两个值 。 Set 内部判断两个值是否不同,使用的算法叫做“Same-value-zero equality”,它类似于精确相等运算符(===),主要的区别是NaN 等于自身,而精确相等运算符认为 NaN 不等于自身。
js
let set = new Set();
set.add(NaN);
set.add(NaN);
set; // Set {NaN}
let set1 = new Set();
set1.add(1);
set1.add("1");
console.log([...set1]); // [1, "1"]WeakSet
- WeakSet 的成员只能是对象,而不能是其他类型的值。
js
const ws = new WeakSet();
ws.add(1);
// TypeError: Invalid value used in weak set
ws.add(Symbol());
// TypeError: invalid value used in weak set- WeakSet 中的对象都是
弱引用
弱引用就是可以被垃圾回收(如果放入数组,那么你不知道什么实际是可以被回收的,因为数组是强引用),
没有总数
不可枚举。
由于 WeakSet 内部有多少个成员,取决于垃圾回收机制有没有运行,运行前后很可能成员个数是不一样的,而垃圾回收机制何时运行是不可预测的
例子
- WeakSet 可以接受一个数组或类似数组的对象作为参数
js
const a = [
[1, 2],
[3, 4],
];
const ws = new WeakSet(a);
// WeakSet {[1, 2], [3, 4]}
const b = [3, 4];
const wsb = new WeakSet(b);
// Uncaught TypeError: Invalid value used in weak set(…)Map
传统对象只能使用字符串作为键
js
const data = {};
const element = document.getElementById("myDiv");
data[element] = "metadata";
data["[object HTMLDivElement]"]; // "metadata"缺点
- Map 本身不会产生内存泄露,但是其使用中容易产生内存泄露,所以建议使用 WeapMap
原因:
- 没有及时清除不再需要的条目
- 将长生命周期的对象作为键或值存储在
Map中
WeapMap
其特点跟 WeakSet 一样 都是
Key 只能是对象(null 除外)
弱引用
弱引用就是可以被垃圾回收(如果放入数组,那么你不知道什么实际是可以被回收的,因为数组是强引用),
没有总数
不可枚举
