# Set 集合
set 集合是键唯一的集合。
let set = new Set([1, 2, 3, 4, 5, 2]); | |
console.log(set); // Set { 1, 2, 3, 4, 5 } |
NaN
、undefined
等值允许存储在 set 集合中。其在 set 集合中是相等的。
let set = new Set([NaN, NaN, undefined, undefined, null, null]);
console.log(set); // Set { 1 NaN, undefined, null }
空数组、空对象、空函数不会被认为是同一个
let set1 = new Set([[], [], {}, {}]);
console.log(set1); //Set { [], [], {}, {} }
# Set 对象的属性和方法
# 属性
size
属性
相当于数组中的 length 属性
let set = new Set([1, 2, 3, 4, 5]); | |
console.log(set.size); // 5 |
# 方法
操作 Set 集合的方法
方法名称 | 描述 |
---|---|
add(value) | 在 Set 集合尾部添加一个元素,返回该 Set 对象 |
delete(value) | 从 Set 集合删除指定的元素。返回布尔值,表示是否删除成功 |
has(value) | 检索 Set 集合是否包含指定的元素。返回布尔值,表示是否包含 |
clear() | 清除 Set 集合中的所有元素,没有返回值。 |
let set = new Set([1, 2, 3, 4, 5]); | |
// add(value) | |
var result = set.add(6); | |
console.log(set, result); | |
//delete (value) value 是值 而不是索引值 | |
var result1 = set.delete(1); | |
console.log(result1, set); // true Set { 2, 3, 4, 5, 6 } | |
//has (value) value 是值 而不是索引值 | |
var result2 = set.has(4); | |
console.log(result2); //true | |
// clear() | |
set.clear(); | |
console.log(set); //Set {} |
遍历 Set 集合的方法
方法名称 | 描述 |
---|---|
values() | 返回一个新的迭代器对象,该对象包含 Set 集合中的按插入顺序的所有元素的值 |
keys() | 与 values() 方法相同 |
entries() | 返回一个新的迭代器,该对象包含 Set 集合中的按插入顺序排列的所有元素的值的 [value,value] 数组 |
forEach() | 按照插入顺序,为 Set 集合中的每一个元素调用一次 callback 函数 |
let set = new Set([1, 2, 3, 4, 5]); | |
//values 方法 | |
// 返回一个迭代器对象,但这个迭代器对象没有 length 属性, | |
// 常规的循环语句无法使用,只能使用 for...of 循环 | |
console.log(set.values()); // [Set Iterator] { 1, 2, 3, 4, 5 } | |
//keys 方法 | |
console.log(set.keys()); // [Set Iterator] { 1, 2, 3, 4, 5 } | |
//entries () 方法 | |
console.log(set.entries()); // [Set Entries] { [ 1, 1 ], [ 2, 2 ], [ 3, 3 ], [ 4, 4 ], [ 5, 5 ] } | |
//forEach () 方法 | |
set.forEach(function (value, index, array) { | |
/** | |
* value 表示当前遍历的值 | |
* index 实际上是 key,key 与 value 相同 | |
* array 表示当前遍历的 set 集合 | |
*/ | |
console.log(value, index, array); | |
}); | |
/* | |
1 1 Set { 1, 2, 3, 4, 5 } | |
2 2 Set { 1, 2, 3, 4, 5 } | |
3 3 Set { 1, 2, 3, 4, 5 } | |
4 4 Set { 1, 2, 3, 4, 5 } | |
5 5 Set { 1, 2, 3, 4, 5 } | |
*/ |
Set 集合中键与值相同。
# Set 集合和 Array 对比
对象集合的优势
- 数组中用于判断元素是否存在的
indexOf()
函数效率低下。 - Set 对象允许根据值删除元素,而数组中必须使用基于下标的
splice()
方法。 - 数组的
indexOf()
方法无法找到 NaN 值。 - Set 对象存储不重复的值,所以不需要手动处理包含重复值的情况。
# WeakSet 是什么
用于存储对象的集合,并且每个对象只能出现一次。
- 只能存放对象,不能存放值。
- 存储的对象值都是被弱引用。
WeakSet 提供的操作方法与 Set 提供的操作方法相同。但其没有遍历方法。
// WeakSet 集合只能存储对象 | |
var ws = new WeakSet(); | |
var obj1 = {}; | |
var obj2 = {}; | |
ws.add(obj1).add(obj2); | |
console.log(ws); |
# Map 集合
Map 集合是键值对的集合。任何值都可以作为 Map 集合中的键或值。Map 集合可以按照插入的顺序迭代它的元素。
方法名称 | 描述 |
---|---|
set(key,value) | 设置 Map 对象中键的值。返回该 Map 对象 |
get(key) | 返回键对应的值。如果不存在,则返回 undefined |
delete(key) | 从 Map 集合删除指定的键值对。返回布尔值,表示是否删除成功 |
has(key) | 检索 Map 集合是否包含指定键值对对应的值。返回布尔值,表示是否包含 |
clear() | 清楚 Map 集合中所有键值对,没有返回值 |
values() | 返回一个新的迭代器对象,该对象包含 Map 集合中所有元素的值 |
keys() | 与 values() 方法相同 |
entries() | 返回一个新的迭代器对象,该对象包含 Map 集合中的按插入顺序排列的所有元素的值 [key,value] 数组 |
forEach() | 按照插入顺序,为 Map 集合中的每一个元素调用一次 callback 函数 |
// 创建 Map 集合 | |
let map = new Map(); | |
let num = 100, | |
str = "张无忌", | |
fun = function () {}, | |
obj = {}; | |
map.set("num", num); | |
map.set("str", str); | |
map.set("fun", fun); | |
map.set("obj", obj); | |
console.log(map); | |
console.log(map.get("str")); // 张无忌 |
Map 集合的键的比较是基于 “SameValueZero” 算法:
- 判断使用
===
相似的规则 - -0 和 + 0 相等
- NaN 与自身相等