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
汇合的key
跟value
一样,所以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字典
的属性,WeakMap
的key
必须是个援用对象,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) // 37m.get(o2) // Hello world
这个看起来很奇怪,key
必须是个援用对象,所以必须独自申明o1,o2
,这样跟间接申明let m = 'Hello World'
有什么区别
答案: WeakMap是个弱援用,它的值在堆外面,如果它不应用就会被垃圾回收机制主动回收了,这样key
也有效了,天然也会被回收
WeakSet 和 WeakMap 不能遍历