一、Set
Set
结构是ES6
新增的数据结构,它的结构类似数组,但是不能有重复的数据。
const temp1 = new Array(1, 2, 3, 3);
console.log(temp1); //[1, 2, 3, 3]
const temp2 = new Set([1, 2, 3, 3]);
console.log(temp2); //Set(3) {1, 2, 3}
看上例会发现,Set
数据结构如果有重复的元素就会自动去重。
1. 提供的API
- 添加一个元素
let temp = new Set(["a"]);
temp.add("b");
console.log(temp); // Set(2) {"a", "b"}
- 删除一个元素
let temp = new Set(["a", "b"]);
temp.delete("b");
console.log(temp); // Set(1) {"a"}
- 判断是否存在某个元素
let temp = new Set(["a"]);
console.log(temp.has("a")); // true
console.log(temp.has("b")); // false
- 获取元素长度
let temp = new Set(["a"]);
console.log(temp.size); // 1
- 清空所有元素
let temp = new Set(["a"]);
temp.clear();
console.log(temp); // Set(0) {}
2、Set支持链式调用
链式调用在之前的jquery
中很常用,也是非常便捷的操作,而Set
同样支持。
let temp = new Set([1, 2]);
temp.add(3).add(4).delete(1);
console.log(temp); //Set(3) {2, 3, 4}
3、Set的遍历方式
Set
因为它有内置的迭代器,所以可以用for of
来遍历。
let str = "";
for (let key of temp.values()) {
str += key;
}
console.log(str); // 123
要注意的是Set
内部它的键名和值是相等的。
const temp = new Set([1, 2, 3]);
for (let [key, value] of temp.entries()) {
console.log(key + "-" + value);
};
// 1-1
// 2-2
// 3-3
console.log(Set.prototype.keys === Set.prototype.values); //true
此外,Set
的原型上也有forEach
。
const temp = new Set([1, 2, 3, 3]);
temp.forEach((res) => {
console.log(res); // 依次输出1 2 3
});
4、Set可用于数组去重
可以利用Set
本身自动去重的特性实现,再将Set
转成数组就就可以实现。
function uniq(arr){
return [...new Set(arr)];
};
console.log(uniq([1,2,3,2,3,4,5,6,7,8])); //[1, 2, 3, 4, 5, 6, 7, 8]
二、WeakSet
WeakSet
的成员只能是对象,不支持其他类型。而Set
官方建议是成员用基本数据类型。
const temp = new WeakSet();
temp.add(1); //Invalid value used in weak set
正如它的名字weak
,它是对象的弱引用,垃圾回收机制不考虑,所以不会造成内存的泄露,同时是无法遍历的,因为你不知道什么时候对象的引用消失了,而且没有size
属性,它只支持has
,delete
和add
。
const wSet = new WeakSet([{ a: 1 }]);
wSet.add({ b: 2 });
wSet.delete({ a: 1 });
console.log(wSet.has({ b: 2 })); //false
console.log(wSet); // WeakSet(2) {{a: 1},{b: 2}}
三、Map
Map
类似于json
,不过区别是json
的键名只支持字符串,而Map
的键名支持任意类型。
const temp = new Map();
temp.set("name", "don");
temp.set(true, "yes");
temp.set({ age: 18 }, 1);
console.log(temp); // Map(3) {"name" => "don", true => "yes", {…} => 1}
看上例可以发现键名可以是字符串,布尔值,甚至是对象等任意类型。
1. 提供的API
- 添加键值对到
Map
中
const temp = new Map();
temp.set("name", "don");
console.log(temp); // Map(1) {"name" => "don"}
- 获取
Map
中某一个键的对应值
const temp = new Map([["name", "don"]]);
temp.get("name");
console.log(temp); // Map(1) {"name" => "don"}
- 将
Map
某一键值对移除映射
const temp = new Map([["name", "don"]]);
temp.delete("name");
console.log(temp); // Map(0) {}
- 清空
Map
中所有键值对
const temp = new Map([["name", "don"],["age", "18"]]);
temp.clear();
console.log(temp); // Map(0) {}
- 检查
Map
中是否包含某一键值对
const temp = new Map([["name", "don"],["age", "18"]]);
console.log(temp.has("name")); // true
-
Map
中键值对的数量
const temp = new Map([["name", "don"],["age", "18"]]);
console.log(temp.size); // 2
2. Map的遍历方式
Map
因为它有内置的迭代器,所以可以用for of
来遍历。这里要注意的是用for of
遍历Map
对象temp
,等同于用Object.entries(temp)
。
const temp = new Map([
["name", "don"],
["age", "18"],
]);
for (let [key, value] of temp) {
console.log(key + "-" + value); // 依次输出 name-don age-18
};
//等同于
for (let [key, value] of Object.entries(temp)) {
console.log(key + "-" + value); // 依次输出 name-don age-18
}
Map
同样支持forEach
const temp = new Map([
["name", "don"],
["age", "18"],
]);
temp.forEach((key,value) => {
console.log(key + "-" + value); // 依次输出 name-don age-18
});
四、WeakMap
WeakMap
对象中的键只能是对象引用,WeakMap
不能包含无引用的对象,否则会被自动清除出集合(垃圾回收机制)。
const temp = new WeakMap();
temp.set("nmae", "don"); // Invalid value used as weak map key
它只支持set
,get
,delete
,has
四个api
。
网友评论