Set
2020 javascriptMap 和 Set 是 ES6 中新增的数据结构,Set 类似于数组,但是其中的值是唯一的。我们一般将 Set 跟 Array 进行类比。
Set
set 是一个值的集合,其中的值是唯一。
set 的 API 跟 map 类似,add(..) 方法代替了 set(..) 方法,没有 get(..) 方法。
var s = new Set();
var x = { id: 1 },
y = { id: 2 };
s.add(x);
s.add(y);
s.add(x);
s.size; // 2
s.has(y); // true
s.delete(y);
s.clear();
set 的唯一性可以用作一些地方:
var arr = [1, 2, 3, 4, '1', 2, 4, '5'];
var uniques = [...new Set(arr)]; // [ 1, 2, 3, 4, "1", "5" ]
在 set 里面,value 与 key 总是相等。
属性
-
Set.prototype.size
size 属性获取 Set 对象的元素数量。var mySet = new Set(); mySet.add(1); mySet.add(5); mySet.add('text'); mySet.size; // 3
方法
-
Set.prototype.add()
将一个新元素添加到 Set 对象尾部。如果内部对象有重复的基础类型,则会忽略。引用类型的引用地址不同则会被添加。const set1 = new Set(); const obj = { o: 3 }; ```javascript set1.add(42); set1.add({ a: 1 }); set1.add({ a: 1 }); set1.add(obj); set1.add(obj); for (const item of set1) { console.log(item); } // 42 // { a: 1 } // { a: 1 } // { o: 3 }
Set.prototype.clear()
将 Set 对象内所有的元素移除。Set.prototype.delete()
移除指定的元素。若没有则返回false
。-
Set.prototype.entries()
返回一个[value, value]
数组的遍历对象。每个实体的值都是一样的。const set1 = new Set(); set1.add(42); set1.add('forty two'); set1.add({ a: 1 }); const iterator1 = set1.entries(); for (const entry of iterator1) { console.log(entry); } // [42, 42] // ["forty two", "forty two"] // [{ a: 1 }, { a: 1 }]
Set.prototype.forEach()
遍历执行 Set 对象内的元素,参数依次为value, key, set
。Set.prototype.has()
返回指定的元素是否存在于 set 对象。Set.prototype.values()
返回每个元素的值的遍历对象。也可以用别名Set.prototype.keys()
。
WeakSet
WeakSet 的值必须是对象,而不是像 set 一样可以是原生类型值。
var s = new WeakSet();
var x = { id: 1 },
y = { id: 2 };
s.add(x);
s.add(y);
x = null; // x 可 GC
y = null; // y 可 GC
参考链接
- 《你不知道的 JavaScript》(下)
- MDN: Set
- MDN: WeakSet