灏天阁

总结一下 Map,Set,WeakSet,WeakMap

· Yin灏

Set 是叫集合的数据结构,Map 是叫字典的数据结构

相同点:Set 和 Map 存储不重复的值

不同点:Set 用 [value, value] 存储数据,Map 用 [key,value]存储数据

总结

Set:

  • 成员唯一、无序且不重复。
  • [value, value],键值与键名是一致的(或者说只有键值,没有键名)。
  • 可以遍历,方法有:add、delete、has。

Map:

  • 本质上是键值对的集合,类似集合。
  • 可以遍历,方法很多可以跟各种数据格式转换。

WeakSet:

  • 成员都是对象。
  • 成员都是弱引用,可以被垃圾回收机制回收,可以用来保存 DOM 节点,不容易造成内存泄漏。
  • 不能遍历,方法有 add、delete、has。

WeakMap:

  • 只接受对象作为键名(null 除外),不接受其他类型的值作为键名。
  • 键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的。
  • 不能遍历,方法有 get、set、has、delete。

Set

介绍

  • Set 类似数组,成员唯一。
  • Set 本身是构造函数,生成 Set 数据结构。
  • Set 可以存储任意类型的唯一值。
  • Setkey 的值和 value 的值一样
let s = new Set();
[1, 2, 3, 4, 5, 6, 1, 2].map((item) => {
  s.add(item);
}); // [1,2,3,4,5,6]

// 数组去重
let arr = [1, 2, 3, 4, 3, 2, 4, 5];
console.log([...new Set(arr)]);

注:Set 里面加入值时不会发送类型转换,及 5 和 ‘5’ 是两个不同的值,Set 判断两个值是否相等类似于‘===’

但判断 NaN 时,’===‘的判断 NaN 等于 NaN,Set 的判断 NaN 不等于 NaN。

操作

  • add(value):新增,相当于 Array 的 push
let arr = new Set([1, 2, 3, 4, 3, 2, 4, 5]);
arr.add(9); // 1,2,3,4,9
  • delete(value):存在就删除里面的 value
let arr = new Set([1, 2, 3, 4, 3, 2, 4, 5]);
arr.delete(1); // true, 删除成功
  • has(value):判断 Set 里面有没有这个值
let arr = new Set([1, 2, 3, 4, 3, 2, 4, 5]);
arr.has(1); // true
  • clear():清空集合
let arr = new Set([1, 2, 3, 4, 3, 2, 4, 5]);
arr.clear();

遍历

  • keys():返回一个包含集合中所有键的迭代器。
let arr = new Set([1, 2, 3, 4, { a: 1, b: 2 }]);
arr.keys(); // SetIterator {1, 2, 3, 4, {…}}
  • values():返回一个包含集合中所有值得迭代器。
let arr = new Set([1, 2, 3, 4, { a: 1, b: 2 }]);
arr.keys(); // SetIterator {1, 2, 3, 4, {…}}
  • entries():返回一个包含 Set 对象中所有元素得键值对迭代器。
let arr = new Set([1, 2, 3, 4, (a = { a: 1, b: 2 })]);
arr.entries(); // SetIterator {1 => 1, 2 => 2, 3 => 3, 4 => 4, {…} => {…}}

Map

介绍

Map 是键值对的结构,查找速度极快

let a = new Map();
let obj = { a: 1 };
a.set("a", obj); // set 键值对
a.get("a"); // obj
a.has("a"); // true
a.delete("a"); // 删除成功
a.has("a");

操作

  • set(key, value): 字典添加新元素
let a = new Map();
a.set("x", { a: 1 }); // Map(1) {'x' => {…}}
  • get(key):通过键查找值并返回
let a = new Map();
a.set("x", { a: 1 });
a.get("x"); // {a: 1}
  • has(key):判断是否存在 key
let a = new Map();
a.set("x", { a: 1 });
a.has("x"); // true
  • delete(key):通过 key 移除 map 中的 key 的值
let a = new Map();
a.set("x", { a: 1 });
a.delete("x"); // true
  • clear():清空字典全部的内容
let a = new Map();
a.set("x", { a: 1 });
a.clear();

遍历

  • Keys():将字典中包含的所有键名以迭代器形式返回。
let a = new Map();
a.set("x", { a: 1 });
a.keys(); // MapIterator {'x'}
  • values():将字典中包含的所有数值以迭代器形式返回。
let a = new Map();
a.set("x", { a: 1 });
a.values(); // MapIterator {{…}}
  • entries():返回所有成员的迭代器。
let a = new Map();
a.set("x", { a: 1 });
a.entries(); // MapIterator {'x' => {…}}
  • forEach():遍历字典的所有成员。
let a = new Map();
a.set("x", { a: 1 });
a.forEach((item) => {
  console.log(item);
});
// {a: 1}

WeakSet

介绍

weakSet 和 Set 的区别:

  1. WeakSet 只能是对象的集合,不像 Set 一样什么类型数据都能存储。
  2. WeakSet 集合里面对对象的引用是弱引用,即如果集合里面的对象没有被外部引用,就会被回收掉。

操作

  • add(value):在 WeakSet 对象中添加一个元素 value。
let aaa = new WeakSet();
aaa.add({}); // WeakSet {{…}}
  • has(value):判断 WeakSet 对象中是否包含 value。
let a = {};
let aaa = new WeakSet();
aaa.add(a);
aaa.has(a); // true
  • delete(value):删除元素 value。
let a = {};
let aaa = new WeakSet();
aaa.add(a);
aaa.delete(a); // true

WeakMap

介绍

WeakMap 和 Map 的区别:

  1. WeakMap 也是键值对集合,但是键必须是弱引用对象,而值可以是任意类型
  2. WeakMap 集合里面键的对象的引用是弱引用,即如果集合里面键的对象没有被外部引用,就会被回收掉。

操作

  • set(key,value):设置 WeakMap 键值对
  • get(key): 获取 WeakMap 键对应的值
  • has(key): 有没有与这个 key 关联的值
  • delete(key): 删除可以关联的键值对

- Book Lists -