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"
WeapMap
其特点跟 WeakSet 一样 都是
Key 只能是对象(null 除外)
弱引用
弱引用就是可以被垃圾回收(如果放入数组,那么你不知道什么实际是可以被回收的,因为数组是强引用),
没有总数
不可枚举