九、ES6中键值对集合
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 与自身相等
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小康博客!
评论
TwikooDisqusjs









