参考教程《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 结构的实例的属性和操作方法:
size
、set(key, value)
、get(key)
、has(key)
、delete(key)
、clear()
- 遍历方法:
keys()
、values()
、entries()
、forEach()
WeakMap
1、WeakMap
只接受对象作为键名!
2、WeakMap
的键名所指向的对象,不计入垃圾回收机制。
WeakMap 结构只有四个方法:get()
、set()
、has()
、delete()
。