Set、Map、WeakSet 和 WeakMap 的区别

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。

你可能感兴趣的:(JavaScript,前端常见问题)