Set 集合

set 集合是键唯一的集合。

1
2
let set = new Set([1, 2, 3, 4, 5, 2]);
console.log(set); // Set { 1, 2, 3, 4, 5 }
  • NaNundefined等值允许存储在 set 集合中。

    其在 set 集合中是相等的。

    1
    2
    let set = new Set([NaN, NaN, undefined, undefined, null, null]);
    console.log(set); // Set { 1 NaN, undefined, null }
  • 空数组、空对象、空函数不会被认为是同一个

    1
    2
    let set1 = new Set([[], [], {}, {}]);
    console.log(set1); //Set { [], [], {}, {} }

Set 对象的属性和方法

属性

size属性

相当于数组中的 length 属性

1
2
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 集合中的所有元素,没有返回值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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 提供的操作方法相同。但其没有遍历方法

1
2
3
4
5
6
7
8
9
// 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 函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 创建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 与自身相等