一、Map和WeakMap
Map可以接受各种类型的值当作键,对同一个对象的引用才视为同一个键,否则取不到。
属性:get,set,has,delete,clear
遍历:keys,valuse,forEach,entries(遍历顺序就是插入顺序)
WeakMap 只接受对象作为键值,null除外,键名所引用的对象都是弱引用,不会计入垃圾回收机制,一旦不需要会自动删除。
属性:get,set,has,delete
二、Set和WeakSet
Set 成员惟一,不会有重复的值,判断和===差不多效果,区别在于NaN是等于自身的,===是不相等的
属性:size,add,delete,has,clear
遍历:keys,values,entries,forEach(keys 和values 一致)
Array.from方法可以将Set转化为array
WeakSet 只能放对象,对象的弱引用,如果在其他地方无引用则垃圾回收
属性:add,delete,has
不能遍历
三、Symbol.iterat
object用for...of需要加Symbol.itera需要加
let obj = {
0: 'a',
1: 'b',
2: 'c',
length: 3,
[Symbol.iterator]: function () {
// index用来记遍历圈数
let index = 0;
let next = () => {
return {
value: this[index],
done: this.length == ++index
}
}
return {
next
}
}
}
四、Symbol基础数据类型
let s = Symbol('any')
每个Symbol都是惟一,可以用来做键值。
但是针对obj的for in,object.keys不能遍历到以Symbol做键值的属性。可以避免对外操作
JSON.stringify也会忽略
可以使用Object.getOwnPropertySymbol(obj)=> ['Symbol('name')]
Reflect.ownKeys(obj) 可以遍历到Symbol
可以私有化属性,只有在当前模块才能访问,因为Symbol惟一
Symbol.for('name') 可以创建多个window下的唯一Symbol