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对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。
NaN
和undefined
都可以被存储在Set 中, NaN
之间被视为相同的值(尽管 NaN !== NaN)。
与array的区别:
- 不能出现重复值
- 没有索引值
4、WeakSet
WeakSet
对象允许你将弱保持对象存储在一个集合中。
WeakSet
对象中只能存放对象引用, 不能存放值, 而Set
对象都可以.WeakSet
对象中存储的对象值都是被弱引用的, 如果没有其他的变量或属性引用这个对象值, 则这个对象值会被当成垃圾回收掉. 正因为这样,WeakSet
对象是无法被枚举的, 没有办法拿到它包含的所有元素.
5、Object
- key只能是字符串
- 迭代顺序有可能不同于插入的顺序
- 长度只能手动计算
6、Array
- 有index索引值
- 可出现重复值