乐趣区

关于javascript:SetMapWeakSetWeakMap

set

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

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

Set是一种 汇合 ,模式是[value, value],即key 跟 value 是统一的

所以能够用 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]

实例属性:

  • 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 不能遍历

退出移动版