集合(Set
)对象允许你存储任意类型的唯一值(不能重复),无论它是原始值或者是对象引用。
语法
new Set([iterable]);
参数
- iterable
- 一个可迭代对象,其中的所有元素都会被加入到 Set 中。
null
被视作undefined
。
简述
Set
对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。
值的相等
因为 Set 中的值总是唯一的,所以需要判断两个值是否相等。判断相等的算法与严格相等(===操作符)不同。具体来说,对于 Set , +0 (+0 严格相等于-0)和-0是不同的值。尽管在最新的 ECMAScript 6规范中这点已被更改。从Gecko 29.0和 recent nightly Chrome开始,Set 视 +0 和 -0 为相同的值。另外,NaN
和undefined
都可以被存储在Set 中, NaN
之间被视为相同的值(尽管 NaN !== NaN)。
属性
Set.length
length
属性的值为0。get Set[@@species]
- 构造函数用来创建派生对象.
Set.prototype
- 表示Set构造器的原型,允许向所有Set对象添加新的属性。
Set
实例
所有Set实例继承自 Set.prototype
。
属性
Set.prototype.constructor
- 返回实例的构造函数。默认情况下是
Set
。 Set.prototype.size
- 返回
Set
对象的值的个数。
方法
Set.prototype.add(value)
- 在
Set对象尾部添加一个元素。返回该
Set对象。
Set.prototype.clear()
- 移除
Set
对象内的所有元素。 Set.prototype.delete(value)
移除Set的中与这个值相等的元素,返回Set.prototype.has(value)在这个操作前会返回的值(即如果该元素存在,返回true,否则返回false)。
Set.prototype.has(value)在此后会返回false。
Set.prototype.entries()
返回一个新的迭代器对象,该对象包含Set对象中的
按插入顺序排列的所有元素的值的[value, value]数组。为了使这个方法
和Map对象保持相似,
每个值的键和值相等。Set.prototype.forEach(callbackFn[, thisArg])
- 按照插入顺序,为Set对象中的每一个值调用一次callBackFn。如果提供了
thisArg参数,回调中的this会是这个参数。
Set.prototype.has(value)
- 返回一个布尔值,表示该值在
Set中存在与否。
Set.prototype.keys()
- 与
values()
方法相同,返回一个新的迭代器对象,该对象包含Set对象中的
按插入顺序排列的所有元素的值。
Set.prototype.values()
返回一个新的迭代器对象,该对象包含Set对象中的
按插入顺序排列的所有元素的值。
Set.prototype[@@iterator]()
返回一个新的迭代器对象,该对象包含Set对象中的
按插入顺序排列的所有元素的值。
示例
使用Set
对象
var mySet = new Set(); mySet.add(1); mySet.add(5); mySet.add("some text"); mySet.has(1); // true mySet.has(3); // false, 3还没有被添加到set中 mySet.has(5); // true mySet.has(Math.sqrt(25)); // true mySet.has("Some Text".toLowerCase()); // true mySet.size; // 4 mySet.delete(5); // 从set中移除5 mySet.has(5); // false, 5已经被移除 mySet.size; // 3, 我们刚刚移除了一个值
迭代Set
// 迭代整个set // 按顺序输出:1, "some text" for (let item of mySet) console.log(item); // 按顺序输出:1, "some text" for (let item of mySet.keys()) console.log(item); // 按顺序输出:1, "some text" for (let item of mySet.values()) console.log(item); // 按顺序输出:1, "some text" //(键与值相等) for (let [key, value] of mySet.entries()) console.log(key); // 转换Set为Array (with Array comprehensions) var myArr = [v for (v of mySet)]; // [1, "some text"] // 替代方案(with Array.from) var myArr = Array.from(mySet); // [1, "some text"] // 如果在HTML文档中工作,也可以: mySet.add(document.body); mySet.has(document.querySelector("body")); // true // Set和Array互换 mySet2 = new Set([1,2,3,4]); mySet2.size; // 4 [...mySet2]; // [1,2,3,4] // 截取 var intersection = new Set([x for (x of set1) if (set2.has(x))]); // 用forEach迭代 mySet.forEach(function(value) { console.log(value); }); // 1 // 2 // 3 // 4
与 Array 的联系
var myArray = ["value1", "value2", "value3"]; // 用Set构造器将Set转换为Array var mySet = new Set(myArray); mySet.has("value1"); // returns true // 用...(展开操作符)操作符将Set转换为Array alert(uneval([...mySet])); // 与myArray完全一致
规范
规范 | 状态 | 备注 |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) Set |
Standard | 初始定义 |
ECMAScript 2017 Draft (ECMA-262) Set |
Draft |
浏览器兼容性
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support |
31 [1] |
13 (13) | 11 | 25 | 7.1 |
Constructor argument: new Set(iterable) |
38 | 13 (13) | 未实现 | 25 | 未实现 |
iterable | 38 | 17 (17) | 未实现 | 25 | 7.1 |
Set.clear() |
31 [1] 38 |
19 (19) | 11 | 25 | 7.1 |
Set.keys(), Set.values(), Set.entries() |
37 [1] 38 |
24 (24) | 未实现 | 25 | 7.1 |
Set.forEach() |
36 [1] 38 |
25 (25) | 11 | 25 | 7.1 |
Value equality for -0 and 0 | 34 [1] 38 |
29 (29) | 未实现 | 25 | 未实现 |
Constructor argument: new Set(null) |
(Yes) | 37 (37) | ? | ? | ? |
Monkey-patched add() in Constructor |
(Yes) | 37 (37) | ? | ? | ? |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | 未实现 | 31 [1] 38 |
13.0 (13) | 未实现 | 未实现 | iOS 8 |
Constructor argument: new Set(iterable) |
未实现 | 38 | 13.0 (13) | 未实现 | 未实现 | 未实现 |
iterable | 未实现 | 未实现 | 17.0 (17) | 未实现 | 未实现 | iOS 8 |
Set.clear() |
未实现 | 31 [1] 38 |
19.0 (19) | 未实现 | 未实现 | iOS 8 |
Set.keys(), Set.values(), Set.entries() |
未实现 | 37 [1] 38 |
24.0 (24) | 未实现 | 未实现 | iOS 8 |
Set.forEach() |
未实现 | 36 [1] 38 |
25.0 (25) | 未实现 | 未实现 | iOS 8 |
Value equality for -0 and 0 | 未实现 | 34 [1] 38 |
29.0 (29) | 未实现 | 未实现 | 未实现 |
Constructor argument: new Set(null) |
? | (Yes) | 37.0 (37) | ? | ? | ? |
Monkey-patched add() in Constructor |
? | (Yes) | 37.0 (37) | ? | ? | ? |
[1] Chrome 中该特性需要在 chrome://flags
中打开开关 “Enable Experimental JavaScript”.