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}}
- 成员唯一、无序且不重复(但是不能判断对象是否重复);
- [value, value],键值与键名是一致的(或者说只有键值,没有键名);
- 可以遍历,方法有:add、delete、has、clear、entries、forEach、keys、values
- Set也能用来保存NaN和undefined, 如果有重复的NaN, Set会认为就一个NaN(实际上NaN!=NaN);
map
Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。
- 本质上是键值对的集合,类似集合;
- 可以遍历,方法很多,可以跟各种数据格式转换。
- 转换为数组: Array.from(map) 或者 […map]
- 转换为对象:
function strMapToObj(strMap) {
let obj = Object.create(null);
for (let [k,v] of strMap) {
obj[k] = v;
}
return obj;
}
const myMap = new Map()
.set('yes', true)
.set('no', false);
strMapToObj(myMap)
// { yes: true, no: false }
- 转换为json:
const map = new Map();
map.set(1,"foo").set(2,"bar").set(3,"baz");
const mapChangeJson = (map) => JSON.stringify(mapChangeObj(map));
console.log(mapChangeJson(map));
- 和object的对比:
- 一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值。
- Map 中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。
- Map 的键值对个数可以从 size 属性获取,而 Object 的键值对个数只能手动计算。
- Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。
WeakSet
WeakSet结构和Set类似,都是不重复值的集合。
- 成员都是对象;
- 成员都是弱引用,可以被垃圾回收机制回收,可以用来保存 DOM 节点,不容易造成内存泄漏;
- 不能遍历,方法有 add、delete、has。
WeakMap
MDN:WeakMap 的键只能是Object类型。不允许将原始数据类型作为键(例如 aSymbol不能是WeakMap键)。
- 只接受对象最为键名(null 除外),不接受其他类型的值作为键名;
- 键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的;
- 不能遍历,方法有 get、set、has、delete。