总结
能用Map就用Map, Object对比Map没有明显优势
- 数据量大,频繁写入用Map
- 对写入顺序有要求使用Map
分析
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 应用场景的真相居然是 ...