高级之路篇二十二:map、weakMap、set、weakSet、object、array的区别

1、map

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

 

  • 键值对结构。
  • 任何值(对象或者原始值) 都可以作为一个键或一个值。
  • 强引用存储
  • null 会被当做 undefined。
  • 虽然NaN !== NaN , 但是map中 NaN 是与 NaN 相等的。

与object的一些对比:

  • 一个Object的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值,包括函数、对象、基本类型。
  • Map 中的键值是有序的,而添加到对象中的键则不是。因此,当对它进行遍历时,Map 对象是按插入的顺序返回键值。
  • 你可以通过 size 属性直接获取一个 Map 的键值对个数,而 Object 的键值对个数只能手动计算。
  • Map 可直接进行迭代,而 Object 的迭代需要先获取它的键数组,然后再进行迭代。
  • Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。虽然 ES5 开始可以用 map = Object.create(null) 来创建一个没有原型的对象,但是这种用法不太常见。
  • Map 在涉及频繁增删键值对的场景下会有些性能优势。

缺点:

  • 性能不及WakeMap
  • 强引用,垃圾回收算法不能及时清理,容易内存泄漏

 

2、WakeMap 

WeakMap 对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。

缺点:由于弱引用,key树不确定的,所以WeakMap 的 key 是不可枚举的。

 

3、Set

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

NaNundefined都可以被存储在Set 中, NaN之间被视为相同的值(尽管 NaN !== NaN)。

与array的区别:

  • 不能出现重复值
  • 没有索引值

 

4、WeakSet

WeakSet 对象允许你将弱保持对象存储在一个集合中。

  • WeakSet 对象中只能存放对象引用, 不能存放值, 而 Set 对象都可以.
  • WeakSet 对象中存储的对象值都是被弱引用的, 如果没有其他的变量或属性引用这个对象值, 则这个对象值会被当成垃圾回收掉. 正因为这样, WeakSet 对象是无法被枚举的, 没有办法拿到它包含的所有元素.

 

5、Object

  • key只能是字符串
  • 迭代顺序有可能不同于插入的顺序
  • 长度只能手动计算

 

6、Array

  • 有index索引值
  • 可出现重复值

 

 

 

 

 

你可能感兴趣的:(JavaScript)