Set
结构类似数组,但是没有重复的值
Set 的遍历顺序是插入顺序
没有字面量表达式,只能通过 new Set() 构造,并通过 add 方法添加项目:
const s = new Set();
[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));
可以接受有 Iterator 接口的对象作为参数进行初始化:
const set = new Set([1, 2, 3, 4, 4]);
[...set] // [1, 2, 3, 4]
实例属性和方法:
size()
返回成员数量
add(value)
添加成员
delete(value)
删除成员
has(value)
检查是否是Set的成员
clear()
清除所有成员
keys()
:返回键名的遍历器
values()
:返回键值的遍历器
entries()
:返回键值对的遍历器
forEach()
:使用回调函数遍历每个成员
for...of
let set = new Set(['red', 'green', 'blue']);
for (let item of set.entries()) {
console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]
Set 的很多操作可以先转成数组去做,然后再转回Set
let set = new Set([1, 2, 3]);
set = new Set([...set].map(x => x * 2));
// 返回Set结构:{2, 4, 6}
Map
Map 和对象的区别在于可以使用各种类型的值作为 key;使用对象作为 key,可以避免同名属性冲突的问题
Map 的遍历顺序是插入顺序
const m = new Map();
const o = {p: 'Hello World'};
m.set(o, 'content')
m.get(o) // "content"
m.has(o) // true
m.delete(o) // true
m.has(o) // false
作为构造函数,Map 可以接受数组作为参数:
const map = new Map([
['name', '张三'],
['title', 'Author']
]);
map.size // 2
map.has('name') // true
map.get('name') // "张三"
任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构都可以当作 Map 构造函数的参数
实例属性和方法:
size()
返回成员总数
set(key, value)
更新键值,返回 map
get(key)
has(key)
返回布尔值
delete(key)
返回布尔值
clear()
清除所有成员,没有返回值
keys()
:返回键名的遍历器
values()
:返回键值的遍历器
entries()
:返回键值对的遍历器
forEach()
:使用回调函数遍历每个成员
for...of
Map 的很多操作可以先转成数组去做,然后再转回Map
const map1 = new Map(
[...map0].filter(([k, v]) => k < 3)
);
WeakSet 和 WeakMap
WeakSet 的成员只能是对象,WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用
WeakMap 只接受对象作为key,且 key 指向的对象不计入垃圾回收机制