Map && Set
Map 和 Object 的区别
他们的类似之处在于:都可以按「键」来存取、删除键、检测一个键是否绑定了值
- 对象的键只能是String 或者 Symbols,但是 Map 的 key 则可以是任意值
- Map 的键是有序的,而 Object则不是
Chrome Opera 的 JavaScript 解析引擎遵循的是新版 ECMA-262 第五版规范。因此,使用 for-in 语句遍历对象属性时遍历书序并非属性构建顺序。 而 IE6 IE7 IE8 Firefox Safari 的 JavaScript 解析引擎遵循的是较老的 ECMA-262 第三版规范,属性遍历顺序由属性构建的顺序决定。
但我测试了,在 chrome 和 fireFox 上 var obj = {2:2,1:1}; Object.keys(obj); 的结果都是 ['1', '2']
- 可以通过 size 属性直接获取一个 Map 的键值对个数,而 Object 的键值对个数只能手动计算
- Map 可直接进行迭代,而 Object 的迭代需要先获取它的键数组,然后再进行迭代
- Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突
- Map 在频繁增删键值对的场景下会有些性能优势
这三条提示可以帮你决定用Map还是Object:
- 如果键在运行时才能知道,或者所有的键类型相同,所有的值类型相同,那就使用Map。
- 如果需要将原始值存储为键,则使用Map,因为Object将每个键视为字符串,不管它是一个数字值、布尔值还是任何其他原始值。
- 如果需要对个别元素进行操作,使用Object。
Map 和 WeakMap 的区别
- WeakMap 的键必须是对象
- 键被弱保持,也就是说,当其键所指对象没有其他地方引用的时候,它会被GC回收掉
- WeakMap的键是不可枚举的
WeakMap对象的一个用例是存储一个对象的私有数据或隐藏实施细节
Set 相比 Array 有这些好处
- 数组中用于判断元素是否存在的indexOf 函数效率低下
- Set 对象允许用值来删除元素,而数组只能通过
splice
- 数组的 indexOf 方法无法找到 NaN
- Set对象存储不重复的值,所以不需要手动处理包含重复值的情况
Set 与 WeakSet
- WeakSets中的值必须是对象类型,不可以是别的类型
- WeakSet的“weak”指的是,对集合中的对象,如果不存在其他引用,那么该对象将可被垃圾回收。于是不存在一个当前可用对象组成的列表,所以WeakSets不可枚举
Comments