欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Set、Map、WeakSet 和 WeakMap 的区别

程序员文章站 2022-06-12 21:43:18
...

Set

MDN:Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。

let a = new Set();
undefined
a.add(1);
// 输出 Set(1) {1}
a.add(2);
// 输出 Set(2) {1, 2}
a.add(2);
// 输出 Set(2) {1, 2}

从代码上可以看出去重
但是

let b =  new Set();
b.add({val:1})
b.add({val:1})
//  输出 Set(2) {{val:1}, {val:1}}

也就是说明并不能判断对象是否重复

let a = {val:1};
let b =  new Set();
b.add({a)
b.add(a)
//  输出 Set(1) {{val:1}}

object 类型只能判断对象是否是同一个引用而去重的,也就是可能在Set内部中用的是===来判断的

set总结

  • 成员唯一、无序且不重复;

  • [value, value],键值与键名是一致的(或者说只有键值,没有键名);

  • 可以遍历,方法有:add、delete、has、clear、entries、forEach、keys、values

  • Set也能用来保存NaN和undefined, 如果有重复的NaN, Set会认为就一个NaN(实际上NaN!=NaN);

WeakSet

成员都是对象;

成员都是弱引用,可以被垃圾回收机制回收,可以用来保存 DOM 节点,不容易造成内存泄漏;

不能遍历,方法有 add、delete、has。

Map

本质上是键值对的集合,类似集合;

可以遍历,方法很多,可以跟各种数据格式转换。

WeakMap

只接受对象最为键名(null 除外),不接受其他类型的值作为键名;

键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的;

不能遍历,方法有 get、set、has、delete。