ES6

ES6 的 Set 和 Map

Posted by violetks on December 20, 2019

参考教程《ECMAScript 6 入门》——阮一峰

Set

Set 本身是一个构造函数,用来生成 Set 数据结构。它类似于数组,但是成员的值都是唯一的,没有重复的值。

let set = new Set();
// 接受一个数组,用来初始化
let set = new Set([1, 2, 3, 4, 4]);

Set 实例的方法分为两大类:操作方法遍历方法
1、操作方法
(1)add(value):向 Set 结构添加成员,不会添加重复的值。

let set = new Set();
set.add(1);
set.add('1');
console.log(set.size);  // 2

向 Set 加入值的时候,不会发生类型转换,所以1'1'是两个不同的值。
在 Set 内部,两个 NaN 是相等。

(2)delete(value):删除某个值,返回一个布尔值,表示是否删除成功。
(3)has(value):返回一个布尔值,表示该值是否为Set的成员。
(4)clear():清除所有成员,没有返回值。

s.add(1).add(2).add(2);

s.has(1) // true
s.has(2) // true
s.has(3) // false

s.delete(2);

2、遍历方法

  • keys():返回键名的遍历器
  • values():返回键值的遍历器
  • entries():返回键值对的遍历器
  • forEach():使用回调函数遍历每个成员
let set = new Set(['a', 'b', 'c']);

for (let item of set.keys()) {
  console.log(item);
}
// a
// b
// c

for (let item of set.values()) {
  console.log(item);
}
// a
// b
// c

for (let item of set.entries()) {
  console.log(item);
}
// ["a","a"]
// ["b","b"]
// ["c","c"]

1、Set 结构键名和键值是同一个值,所以keys方法和values方法的行为完全一致。
2、entries方法返回的遍历器,同时包括键名和键值,所以结果如上。

应用:结合扩展运算符(...),实现并集(Union)、交集(Intersect)和差集(Difference)。

let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);

// 并集
let union = new Set([...a, ...b]);
// Set{1,2,3,4}

// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set{2,3}

// 差集
let difference = new Set([...a].filter(x => !b.has(x)));

WeakSet

1、WeakSet的成员只能是对象!
2、WeakSet中的对象都是弱引用!即垃圾回收机制不考虑WeakSet对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存。好处是不存在内存泄漏问题。
应用:WeakSet适合临时存放一组对象,以及存放跟对象绑定的信息。另一方面,WeakSet的成员是不适合引用的,因为它会随时消失。
3.因为垃圾回收机制的不可预测特点,ES6 规定 WeakSet 不可遍历。
WeakSet 结构有三个方法:add(value)delete(value)has(value),没有size属性。

Map

const m = new Map();
const obj = { p: 'Hello' };

m.set(obj, 'content')   // 将对象 obj 当作 m 的一个键
m.get(obj)   // "content"

m.has(obj)   // true
m.delete(obj) // true
m.has(obj)   // false

1、如果对同一个键多次赋值,后面的值将覆盖前面的值。
2、如果读取一个未知的键,则返回undefined
3、只有对同一个对象的引用,Map 结构才将其视为同一个键。

const map = new Map();
map.set(['a'], 555);
map.get(['a'])  // undefined,因为这是两个值,内存地址不一样
  • Map 结构的实例的属性和操作方法:sizeset(key, value)get(key)has(key)delete(key)clear()
  • 遍历方法:keys()values()entries()forEach()

WeakMap

1、WeakMap只接受对象作为键名!
2、WeakMap的键名所指向的对象,不计入垃圾回收机制。
WeakMap 结构只有四个方法:get()set()has()delete()