Set
基本语法
类似于数组,有两种构造方式。
1 | var s = new Set(); |
加入5和’5’是不同的值,set会返回两个元素。同样,数组和对象也会被认为不一样。
但是另一方面,加入两次NaN
或者Infinity
只会返回一个。
1 | let set = new Set(); |
主要属性方法
操作方法
add(value)
has(value)
delete(value)
clear(): 清除所有成员,没有返回值
1 | set; // Set {NaN, Infinity, [1, 2, 3], [1, 2, 3], Object {}, Object {}} |
遍历方法
keys():返回一个键名的遍历器
values():返回一个键值的遍历器
entries():返回一个键值对的遍历器
forEach():使用回调函数遍历每个成员
Set数据结构没有键名和键值的区别,所以keys
和values
的行为完全一致。
Set.prototype[Symbol.iterator] === Set.prototype.values // true
所以遍历Set的方法可以直接使用for...of
,也可以在set对象上使用扩展运算符(...
)。
1 | let arr = [3, 5, 2, 2, 5, 5]; |
使用set做并集、交集和差集。
1 | var a = new Set([1,2,3]); |
遍历操作中同步改变原来Set结构,可以有两种方法。
1 | // 方法一 |
WeakSet
于Set类似,但是有两个区别。
成员只能是对象
对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用。如果其他对象不在引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存。因此,WeakSet不可遍历
构造函数接收一个数组或者类似数组的对象作为参数。
1 | var a = [[1,2], [3,4]]; |
基本方法还是有三个。
WeakSet.prototype.add(value)
WeakSet.prototype.delete(value)
WeakSet.prototype.has(value)
WeakSet的一个用处,是储存DOM节点,而不用担心这些节点从文档移除时,会引发内存泄漏。
Map
基本用法
JavaScript的对象(Object),本质上是键值对的集合(Hash结构),但是只能用字符串当作键。
1 | var data = {}; |
构造Map对象时可以传入一个数组参数,表示键值对。
1 | var map = new Map([["name", "张三"], ["title", "Author"]]); |
讨论到键的类型,如果是简单类型则比较严格相等(===
),但对于NaN
和Infinity
则视为同一个
1 | let map = new Map(); |
属性方法
size / set(key, value) / get(key)
has(key) / delete(key) / clear()
遍历方法
三个函数一个方法。
keys()
values()
entries()
forEach()
1 | for (let item of map.entries()) { |
map对象也可以使用扩展运算符。
1 | let map = new Map([ |
WeakMap
只接受对象作为键名(null除外),而且键名所指向的对象,不计入垃圾回收机制。
WeakMap
的设计目的在于,键名是对象的弱引用(垃圾回收机制不将该引用考虑在内),所以其所对应的对象可能会被自动回收。当对象被回收后,WeakMap
自动移除对应的键值对。典型应用是,一个对应DOM元素的WeakMap
结构,当某个DOM元素被清除,其所对应的WeakMap
记录就会自动被移除。基本上,WeakMap
的专用场合就是,它的键所对应的对象,可能会在将来消失。WeakMap
结构有助于防止内存泄漏。