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
Write a Comment