ES6 - Set 和 Map

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 指向的对象不计入垃圾回收机制

你可能感兴趣的:(ES6 - Set 和 Map)