美文网首页
Set,WeakSet,Map和WeakMap

Set,WeakSet,Map和WeakMap

作者: _hider | 来源:发表于2021-02-20 11:00 被阅读0次

一、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属性,它只支持hasdeleteadd

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

它只支持setgetdeletehas四个api

相关文章

网友评论

      本文标题:Set,WeakSet,Map和WeakMap

      本文链接:https://www.haomeiwen.com/subject/lsjaxltx.html