Set和Map
2019-03-25 本文已影响0人
吴晗君
前言
学习这些数据结构、Generator前先看遍历器iterator这一章比较好。之前Set、Map这一章看了好几遍,但是看一遍忘一遍。现在先看了iterator,再看这些就是在不断加深遍历器的印象。
Set
翻译
集合
定义
Set是一种数据结构,特点是成员唯一
。在代码中,Set是一个构造函数,参数必须具备iterator接口,WeakSet一样。
字符串去重
[...new Set('ababbc')].join('') // abc
增、改
add
删
delete
clear
查
has
size
遍历
除了keys、values、entries
forEach也可以用来遍历Set结构,注意以下两点:
⚠️遍历Set得到的键名和键值是一个值。
⚠️遍历顺序就是插入顺序。
并集、交集、差集
let a = new Set([1, 2, 3])
let b = new Set([3, 4, 5])
let union = [...new Set([...a, ...b])]
let difference = [...a].filter((x) => !b.has(x))
let intersect = [...a].filter((x) => b.has(x))
在循环中同步改变原Set
1. 转成数组通过操作再转回去
2. 通过Array.form第二个参数,修改完,再转回去。
WeakSet
和Set两个区别:
- 成员只能是对象,添加其他会报错。
- 对成员对引用是弱引用,不在垃圾回收优化考虑范围内。也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存。
- 没有size属性
- 不能被遍历
因为第二点,所以导致WeakSet不能被遍历,原因是垃圾回收时间是不确定的。所以,可能不同时间遍历WeakSet的时候拿到的东西不一样,WeakMap也是一样。
应用
存储DOM节点,避免节点删除后,变量中还保留着节点对象,导致内存泄露。
Map
传统的对象的键只能是字符串。为了解决这个问题,引入了Map,Map可以是任意结构。
api
大致上语法和spi和Set没有区别,麻烦在和各种数据结构之间的转化,基本上靠的是for...of遍历或者拓展运算符。
WeakMap
和Map的区别
- 只接受除了null以外的对象为键名。
- 键名所指向的对象,不计入垃圾回收机制。
场景
WeakMap的专用场合就是,它的键所对应的对象,可能会在将来消失。WeakMap结构有助于防止内存泄漏
api
size、forEach、clear没有