总结一下 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 的区别:
- WeakSet 只能是对象的集合,不像 Set 一样什么类型数据都能存储。
- 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 的区别:
- WeakMap 也是键值对集合,但是键必须是弱引用对象,而值可以是任意类型
- WeakMap 集合里面键的对象的引用是弱引用,即如果集合里面键的对象没有被外部引用,就会被回收掉。
操作
- set(key,value):设置 WeakMap 键值对
- get(key): 获取 WeakMap 键对应的值
- has(key): 有没有与这个 key 关联的值
- delete(key): 删除可以关联的键值对