Skip to content

Set、WeakSet、Map、WeakMap

Set

Set 特点是值唯一无序。类似于数组,但是成员的值都是唯一的,没有重复的值,遍历的话是插入顺序。Array.from(new Set([1,2,3,'1',1,2,3,1])) 依赖值唯一的特性实现去重。

重点

  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 内部有多少个成员,取决于垃圾回收机制有没有运行,运行前后很可能成员个数是不一样的,而垃圾回收机制何时运行是不可预测的

例子

  1. 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 除外)

  • 弱引用

弱引用就是可以被垃圾回收(如果放入数组,那么你不知道什么实际是可以被回收的,因为数组是强引用),

  • 没有总数

  • 不可枚举