likes
comments
collection
share

总结一下Map,Set,WeakSet,WeakMap

作者站长头像
站长
· 阅读数 42

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): 删除可以关联的键值对
转载自:https://juejin.cn/post/7241777515919736892
评论
请登录