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