【数据类型】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}}
  • 成员唯一、无序且不重复(但是不能判断对象是否重复);
  • [value, value],键值与键名是一致的(或者说只有键值,没有键名);
  • 可以遍历,方法有:add、delete、has、clear、entries、forEach、keys、values
  • Set也能用来保存NaN和undefined, 如果有重复的NaN, Set会认为就一个NaN(实际上NaN!=NaN);

map

Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。

  • 本质上是键值对的集合,类似集合;
  • 可以遍历,方法很多,可以跟各种数据格式转换。
  1. 转换为数组: Array.from(map) 或者 […map]
  2. 转换为对象:
   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 }
  1. 转换为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的对比:
  1. 一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值。
  2. Map 中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。
  3. Map 的键值对个数可以从 size 属性获取,而 Object 的键值对个数只能手动计算。
  4. Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。

WeakSet

WeakSet结构和Set类似,都是不重复值的集合。

  • 成员都是对象;
  • 成员都是弱引用,可以被垃圾回收机制回收,可以用来保存 DOM 节点,不容易造成内存泄漏;
  • 不能遍历,方法有 add、delete、has。

WeakMap

MDN:WeakMap 的键只能是Object类型。不允许将原始数据类型作为键(例如 aSymbol不能是WeakMap键)。

  • 只接受对象最为键名(null 除外),不接受其他类型的值作为键名;
  • 键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的;
  • 不能遍历,方法有 get、set、has、delete。

猜你喜欢

转载自blog.csdn.net/qq_38974163/article/details/121382940