总结一下Map,Set,WeakSet,WeakMap
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): 删除可以关联的键值对
转载自:https://juejin.cn/post/7241777515919736892