Map和Object有非常多相似的地方需要我们去更深入的了解和对比,才能分析出他们分别更适合的应用场景。
Map是一种数据结构(它很特别,是一种抽象的数据结构类型),数据一对对进行存储,其中包含键以及映射到该键的值。并且由于键的唯一性,因此不存在重复的键值对。
Map便是为了快速搜索和查找数据而生的。
例如:{(1, "smile"), (2, "cry"), (42, "happy")}
在Map中,每一对数据的格式都为键值对的形式。
注:Map中的键和值可以是任何数据类型,不仅限于字符串或整数。
JavaScript中的常规对象是一种字典类型的数据结构——这意味着它依然遵循与Map类型相同键值对的存储结构。
Object中的key,或者我们可以称之为属性,同样是独一无二的并且对应着一个单独的value。
另外,JavaScript中的Object拥有内置原型(prototype)。需要注意的是,JavaScript中几乎所有对象都是Object实例,包括Map。
例如:{1: 'smile', 2: 'cry', 42: 'happy'}
从定义上来看,Object和Map的本质都是以键值对的方式存储数据,但实质上他们之间存在很大的区别——
var map = new Map([[1,2],[3,4]]);
console.log(map instanceof Object); //true
var obj = new Object();
console.log(obj instanceof Map); //false
Map相对于Object有很多优点,依然存在某些使用Object会更好的场景,毕竟Object是JavaScript中最基础的概念。
具体测试代码:
function createRandomKey() {
return new Date().getTime().toString().substr(6, 7) + '-' + (Math.random() * 100000000).toString().substr(0, 7);
}
let keys = []
function setKeys() {
for (let i = 0; i < 1000000; i++) {
keys.push(createRandomKey())
}
}
setKeys()
let obj = new Object()
let map = new Map()
function getObjectTimeDiff() {
let t1 = new Date().getTime()
for (let i in keys) {
obj[keys[i]] = i
}
let t2 = new Date().getTime()
for (let j in keys) {
let value = obj[keys[j]]
}
let t3 = new Date().getTime()
for (let k in keys) {
obj[keys[k]] = keys[k]
}
let t4 = new Date().getTime()
for (let l in keys) {
delete obj[keys[l]]
}
let t5 = new Date().getTime()
return `object 增:${t2 - t1},读:${t3 - t2},改:${t4 - t3},删:${t5 - t4}`
}
function getMapTimeDiff() {
let t1 = new Date().getTime()
for (let i in keys) {
map.set(keys[i], i)
}
let t2 = new Date().getTime()
for (let j in keys) {
let value = map.get(keys[j])
}
let t3 = new Date().getTime()
for (let k in keys) {
map.set(keys[k], keys[k])
}
let t4 = new Date().getTime()
for (let l in keys) {
map.delete(keys[l])
}
let t5 = new Date().getTime()
return `map 增:${t2 - t1},读:${t3 - t2},改:${t4 - t3},删:${t5 - t4}`
}
console.log(getObjectTimeDiff())
console.log(getMapTimeDiff())
再修改代码,将keys改为下标的的集合,测试key为连续的整数时
function setKeys() {
for (let i = 0; i < 1000000; i++) {
keys.push(i)
}
}
参考文章:
【译】Object与Map的异同及使用场景 https://juejin.cn/post/6844903792094232584
Map和Object性能测试https://juejin.cn/post/6992874755070099492
转载本站文章《再谈Object与Map的使用场景分析:性能对比分析》, 请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/js/2023_0418_8940.html
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。