Set,Map,WeakSet,WeakMap

set

Set 本身是一种构造函数,用来生成 Set 数据结构

new Set([iterable]) // 参数必须时可迭代的,比如数据

Set是一种集合,形式是[value, value],即key跟value是一致的
image.png
所以可以用new Set()来去重,因为不可能存在相同的key

// 去重数组的重复对象
let arr = [1, 2, 3, 2, '5', 5]
[... new Set(arr)]    //  [1, 2, 3, "5", 5]
Set内部判断两个值是否相等的算法类似于 ===,所以5跟'5'是不同的值

实例属性:

  • size: 元素数量

操作方法:

  • add(value): 相当于push
  • delete(value)
  • has(value)
  • clear()

遍历方法:

  • keys(): 返回包含所有key的迭代器
  • values(): 返回包含所有value的迭代器

    因为 Set集合的 keyvalue一样,所以 keys()values()返回的值一致
  • entries(): 返回包含所有元素的键值对迭代器
  • forEach

Map

Map 本身也是一种构造函数,用来生成 Map 数据结构,它的参数是具有Iterator接口、且每个元素都是一个双元素的数组

new Map([['foo',1],['bar',2]])

Map是一种字典,形式是[key, value]
image.png

实例属性:

  • size: 元素数量

操作方法:

  • set(key,value)
  • get(key)
  • delete(value)
  • has(value)
  • clear()

遍历方法:

  • keys(): 返回包含所有key的迭代器
  • values(): 返回包含所有value的迭代器
  • entries(): 返回包含所有元素的键值对迭代器
  • forEach

WeakSet 和 WeakMap

弱引用,为了垃圾回收机制而生,见https://segmentfault.com/a/11...
因为它俩为垃圾回收机制而生,所以必须保证一点,那就是值必须放在堆里面,基于上面set集合map字典的属性,WeakMapkey必须是个引用对象,WeakSet的元素也必须是个引用对象

let s = new WeakSet()
s.add([1,2]) // 数组
s.add({a:1}) // 对象
s.add(function(){}) // 函数
s.add(document.querySelector('#test')) // DOM节点

WeakMap

let m = new WeakMap()
const o1 = {},
      o2 = function() {}
m.set(o1, 37)
m.set(o2, 'Hello world')
m.get(o1) // 37
m.get(o2) // Hello world

这个看起来很奇怪,key必须是个引用对象,所以必须单独声明o1,o2,这样跟直接声明let m = 'Hello World'有什么区别
答案: WeakMap是个弱引用,它的值在堆里面,如果它不使用就会被垃圾回收机制自动回收了,这样key也无效了,自然也会被回收

WeakSet 和 WeakMap 不能遍历

你可能感兴趣的:(javascript)