# object和map有什么区别?

推荐阅读《我应该使用 Object 还是 Map?》 (opens new window)

(1)用法对比

  • key类型:对于 Object 而言,它键(key)的类型只能是字符串,数字或者 Symbol;而对于 Map 而言,它可以是任何类型。(包括 Date,Map,或者自定义对象)
  • 排列顺序:Map 中的元素会保持其插入时的顺序;而 Object 则不会完全保持插入时的顺序,而是遵循一定的规则
  • 是否可迭代:Map 是可迭代对象,所以其中的键值对是可以通过 for of 循环或 .foreach() 方法来迭代的;而普通的对象键值对则默认是不可迭代的,只能通过 for in 循环来访问

(2)句法对比

  • 创建写法:对于 Object 来说,我们在绝大多数情况下都会选择对象字面量const o = {},而map创建则通常只会使用其构造函数const m = new Map()
  • 新增/读取/删除元素的写法不同

(3)性能对比

  • 空的 Object 会比空的 Map 占用更少的内
  • 在拥有一定数量的元素时, Object 会比 Map 占用多占用内存。在需要进行很多新增操作,且需要储存许多数据的时候,使用 Map 会更高效。

总结了一下使用 Map 和 Object 更为合适的时机

【使用 Map】

  • 储存的键不是字符串/数字/或者 Symbol 时,选择 Map,因为 Object 并不支持
  • 储存大量的数据时,选择 Map,因为它占用的内存更小
  • 需要进行许多新增/删除元素的操作时,选择 Map,因为速度更快
  • 需要保持插入时的顺序的话,选择 Map,因为 Object 会改变排序
  • 需要迭代/遍历的话,选择 Map,因为它默认是可迭代对象,迭代更为便捷

【使用 Object】

  • 只是简单的数据结构时,选择 Object,因为它在数据少的时候占用内存更少,且新建时更为高效
  • 需要用到 JSON 进行文件传输时,选择 Object,因为 JSON 不默认支持 Map
  • 需要对多个键值进行运算时,选择 Object,因为句法更为简洁
  • 需要覆盖原型上的键时,选择 Object