Map跟Object到底选哪个?

1,374 阅读2分钟

总结

能用Map就用Map, Object对比Map没有明显优势

  1. 数据量大,频繁写入用Map
  2. 对写入顺序有要求使用Map
  3. 多层数据嵌套用Object,链式读取方便

分析

Object

V8对Object的处理有优化手段;

当对象属性较少或者key为数字类型时,会采用快属性,快属性使用线性结构存储。

当属性变多,为了确保新增跟删除的效率,会采用慢属性,使用键值对的方式存储属性内容。

Map

Map的存储结构是hashMap

对比

  • Object的key只能是数字、字符串、Symbol;Map的key可以是任意类型;
  • Map是迭代对象;Object不可以迭代;
  • Map会记录写入顺序;Object会对key进行序列化后按照字典排序;
  • Map有内置各种操作函数;Object没有;

读写操作对比

写入

// 先定义一个数量上限\
const up = 9999

var mt1 = performance.now()
var map = new Map()
for(var i = 0; i < up; i++) {
  map.set(`f${i}`, {a: i, children: { a: i }})
}

console.log(`   Map: `, performance.now() - mt1)

var ot1 = performance.now()
var obj = {}

for (var i = 0; i < up; i++) {
  obj[`f${i}`] = {b: i, children: {a: i}}
}

console.log('Object: ', performance.now() - ot1)

当我把 up 的值设置为 499999 时,Object 的写入速度才开始稳定的比 Map 耗时更长。小于499999时Object快的比例高一些,但相差不明显。

读取

// 访问
for (var i = 0; i < up; i++) {
  map.get(`f${i}`)
}

在读取速度上,up 的值为 159999 时 Object 的读取速度会稳定比 Map 慢。

删除

// 删除
for(var i = 0; i < up; i++) {
  map.delete(`f${i}`)
}

在删除上,我把 up 的值设置为 199999 ,Object 的删除耗时才会稳定比 Map 慢。

所以,在性能的表现上,新增、删除、读取的速度,在数量非常少时,Object 的表现可能会稍微好那么一点点点,甚至不太明显能感知得出来。 而在数量非常大的时候,Map 的表现会比 Object 好。

参考链接:Map 应用场景的真相居然是 ...