Set
用处
arr = [...new Set(arr)] // 1. 最短的数组去重,...内部使用了for of
[...new Set('aabbcc')].join('') // 2. 'abc' 字符串去重
new Set(document.querySeleclorAll('div')) // 也可传类数组
let s = new Set()
s.add(1) // 返回Set结构本身 对应的是 delete() 返回boolean
s.add(2)
s.has(2) // 返回boolean
s.size // 2
s.clear()
s.size // 0
Array.from(new Set(arr)) // 另外一种去重的写法, 然后就可以用数组的方法了
s.keys()/values()/entries()/forEach()
keys 和 values 是一样的
Set.prototype[Symbol.iterator] === Set.prototype.values
因此可以直接用for of
s.forEach(function(){}, null) // 第二个参数可以改变回调的this指向,如果是箭头函数就不行了。
new Set(Array.from(set, val => val * 2));
WeakSet
可以用来储存DOM节点
.add()
.delete()
.has()
.size 没有
forEach 不行
垃圾回收机制不考虑WeakSet里面的引用, 换句话说,如果其他对象不在引用,垃圾回收机制就回收改对象的内存了, 不考虑改对象是否还存在于WeakSet中
可答性.还能被访问就不回收. 取消引用?
const foos = new WeakSet()
class Foo {
constructor() {
foos.add(this)
}
method () {
if (!foos.has(this)) {
throw new TypeError('Foo.prototype.method 只能在Foo的实例上调用!');
}
}
}
上面代码保证了Foo的实例方法,只能在Foo的实例上调用。 //
Map
用处
- 扩展别人库,用对象作为键,这样避免同名属性冲突
new Map([['a', 1], ['b', 2]]) // 放set也行,前提是双元素的数组结构
set(anyType, value) // 可以连续书写, set也一样
get(key) // get不存在的,则返回undefined
delete(key)
has(key)
size
arr.forEach(([key, value]) => xxx) // arr是二维数组
const m2 = new Map([['baz', 3]]); // 如果 'baz'还是数组,
const m3 = new Map(m2); // 浅拷贝, 如果 'baz'还是数组
NaN === NaN // false 但是map里面视为相等
0 === -0 // true map 视为相等