x-note
Search…
ECMAScript 6 Set 和 WeakSet
SetWeakSet都是 ES6 新增数据结构。

Set

ES6 中的数据结构Set,与其它语言的 Set 对象基本一致,Set 内的所有成员的值都是唯一的。
1
const mySet = new Set([
2
1, 1,
3
'2', '2',
4
null, null,
5
false, false,
6
true, true,
7
undefined, undefined,
8
{}, {},
9
[], [],
10
NaN, NaN,
11
]);
12
13
mySet.forEach((item) => console.log(item));
14
// 1
15
// '2'
16
// null
17
// false
18
// true
19
// undefined
20
// {}
21
// {}
22
// []
23
// []
24
// NaN
Copied!
Set 内部判断两个值是否不同,使用的算法叫做“Same-value-zero equality”,它类似于精确相等运算符(===),主要的区别是NaN等于自身,而精确相等运算符认为NaN不等于自身。
Set实现了iterator接口,因此能使用...扩展符转换成数组(Array)
1
// 数组去重
2
let arr = [1, 2, 3, 1, 2, 3];
3
arr = [...new Set(arr)];
4
console.log(arr, arr.size); // [1, 2, 3] 3
Copied!

常用 API

Set.prototype.add(val)
添加值,返回Set实例本身
1
const mySet = new Set();
2
mySet
3
.add(1)
4
.add(2)
5
.add(3)
6
.add(4);
7
console.log(...mySet); // 1 2 3 4
Copied!
Set.prototype.delete(val)
删除Set实例中的某个值,返回实例本身
1
const mySet = new Set([1, 2, 3]);
2
3
mySet
4
.delete(1)
5
.delete(2);
6
7
console.log(...mySet); // 1
Copied!
Set.prototype.has(val)
判断Set实例中是否存在某个值
1
const obj = {};
2
const mySet = new Set([1, obj]);
3
4
mySet.has(1); // true
5
mySet.has({}); // false
6
mySet.has(obj); // true
Copied!
Set.prototype.clear()
清空Set中存的所有值
1
const mySet = new Set([1, 2, 3]);
2
mySet.clear();
3
console.log(mySet.size); // 0
Copied!
Set.prototype.values()
返回一个Iterator对象,这个对象以插入的Set对象的顺序包含了原Set对象里的每个元素
1
const mySet = new Set([1, 2, 3]);
2
3
mySet.values(); // SetIterator {1, 2, 3}
Copied!
Set.prototype.keys()
Set.prototype.values行为一致
Set.prototype.entries()
类似于Object.prototype.entries类似
Set.prototype.forEach(callback)
类似于Array.prototype.forEach
1
const mySet = new Set([1, 2, 3, 4, 5]);
2
3
mySet.forEach((item) => console.log(item)); // 1 2 3 4 5
Copied!

WeakSet

WeakSet对象与Set大体一致,每个对象值都只能出现一次,不过,不同的是:
  • WeakSet对象只能存放对象引用,不能存放值,而Set对象可以;
  • WeakSet对象中存储的对象值都是弱引用,如果没有其他的变量或属性引用这个对象值,则这个对象值会被当成来记回收掉;
  • WeakSet无法被枚举,没有办法拿到它所包含的元素。
使用WeakSet存储 DOM 节点,就不用担心这些节点从文档中移除时造成内存泄漏。

相关 API

WeakSet.prototype.add(val)
Set.prototype.add()行为类似
WeakSet.prototype.delete(val)
Set.prototype.delete()行为类似
WeakSet.prototype.has(val)
Set.prototype.has()行为类似
WeakSet.prototype.clear()
Set.prototype.clear()行为类似
1
const myWeakSet = new WeakSet();
2
3
let obj0 = {};
4
let obj1 = {};
5
let obj2 = {};
6
7
// myWeakSet.add(1); // TypeError: Invalid value used in weak set
8
9
myWeakSet
10
.add(obj0)
11
.add(obj1)
12
.add(obj2);
13
14
myWeakSet.has(obj0); // true
15
myWeakSet.has(obj1); // true
16
myWeakSet.has(obj2); // true
17
18
myWeakSet.delete(obj0); //
19
myWeakSet.has(obj0); // false
20
21
myWeakSet.clear();
22
myWeakSet.has(obj2); // false
Copied!