Set 对象
set
对象允许你储存任何类型的唯一值,无论是原始值或者是对象引用。
set
对象是值的集合,所以set
是不存在键的。你会发现set
对象中并不存在get、set
方法,只是存在add、has
方法。
set
对象是值的集合,你可以按照插入的顺序迭代它的元素。Set
中的元素只会出现一次,即Set
中的元素是唯一的。
值的相等
因为Set
中的值总是唯一的,所以需要判断两个值是否相等。在ECMAScript
规范的早期版本中,这不是基于和===
操作符中使用的算法相同的算法。具体来说,对于Set
,+0
(+0
严格相等于-0
)和-0
是不同的值。然而,在ECMAScript 2015
规范中这点已被更改。换句话说,现在的浏览器在Set
中认为+0 0 -0
都是相同的。
另外,NaN
和undefined
都可以被存储在Set
中,NaN
之间被视为相同的值NaN
被认为是相同的,尽管NaN !== NaN
**set**
构造函数参数
set
构造函数接收一个可迭代对象,可迭代对象内部的元素将成为Set
对象的元素。
set
对象中是不存在键的,虽然你在浏览器中会发现[[Entries]]
属性中会存在0,1,2,3
这种类似键名的东西。这只是浏览器给你展示出键值对的效果而已,实际上Set
对象并不存在键。
const set = new Set(1); // 报错
const set = new Set([1, 2, 3, undefined, NaN, {}]);
console.log(set);
**Set**
实例属性、实例方法
Set
实例属性size
:返回Set
对象中值的个数。注意是[[Entries]]
属性内部值的个数,并不是Set
对象自身的属性个数。
Set
实例方法:
add
:在Set
对象尾部添加一个元素。返回该set
对象。clear
:移除set
对象内部的所有元素。delete
:移除值为value
的元素,并返回一个布尔值来表示是否移除成功。Set.prototype.has(value)
会在此之后返回false
。has
:返回一个布尔值,表示该值在Set
中存在与否。keys
:与values()
方法相同,返回一个新的迭代器对象,该对象包含set
对象中的按插入顺序排列的所有元素的值。values
:返回一个新的迭代对象,该对象包含set
对象中的按插入顺序排列的所有元素的值。entries
:返回一个新的迭代对象,该对象包含Set
对象中的按插入顺序排列的所有元素的值的[value, value]
数组。为了使这个方法和Map
对象保持相似,每个值的键和值相同。因为set
对象是不存在键的。forEach
:按照插入的顺序,为Set
对象中的每一个值调用一次callbackFn
。如果提供了thisArg
参数,回调中的this
会是这个参数。
const set = new Set([1, 2, false, 'true', 'str']);
set.forEach((key, value) => {
console.log(key, value); // 1, 1 2, 2 false, false
});