Sets
一个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.delete( y );
s.size; // 1
s.clear();
s.size; // 0
Set(..)
构造器形式与Map(..)
相似,它可以接收一个可迭代对象,比如另一个set或者一个值的数组。但是,与Map(..)
期待一个 记录 的列表(键/值数组的数组)不同的是,Set(..)
期待一个 值 的列表(值的数组):
var x = { id: 1 },
y = { id: 2 };
var s = new Set( [x,y] );
一个set不需要get(..)
,因为你不会从一个set中取得值,而是使用has(..)
测试一个值是否存在:
var s = new Set();
var x = { id: 1 },
y = { id: 2 };
s.add( x );
s.has( x ); // true
s.has( y ); // false
注意: has(..)
中的比较算法与Object.is(..)
(见第六章)几乎完全相同,除了-0
和0
被视为相同而非不同。
Set 迭代器
set和map一样拥有相同的迭代器方法。set的行为有所不同,但是与map的迭代器的行为是对称的。考虑如下代码:
var s = new Set();
var x = { id: 1 },
y = { id: 2 };
s.add( x ).add( y );
var keys = [ ...s.keys() ],
vals = [ ...s.values() ],
entries = [ ...s.entries() ];
keys[0] === x;
keys[1] === y;
vals[0] === x;
vals[1] === y;
entries[0][0] === x;
entries[0][1] === x;
entries[1][0] === y;
entries[1][1] === y;
keys()
和values()
迭代器都会给出set中唯一值的列表。entries()
迭代器给出记录数组的列表,记录数组中的两个元素都是唯一的set值。一个set的默认迭代器是它的values()
迭代器。
一个set天生的唯一性是它最有用的性质。例如:
var s = new Set( [1,2,3,4,"1",2,4,"5"] ),
uniques = [ ...s ];
uniques; // [1,2,3,4,"1","5"]
set的唯一性不允许强制转换,所以1
和"1"
被认为是不同的值。