从ES6开始,语法原生支持Map和Set,我个人认为Map的性能应该比Object强。
关于Map与Object的区别,引用https://blog.csdn.net/liangchuannan/article/details/70053038 的说明:(红色字部分)
ES6中Map相对于Object对象有几个区别:
1:Object对象有原型, 也就是说他有默认的key值在对象上面, 除非我们使用Object.create(null)创建一个没有原型的对象;
2:在Object对象中, 只能把String和Symbol作为key值, 但是在Map中,key值可以是任何基本类型(String, Number, Boolean, undefined, NaN….),或者对象(Map, Set, Object, Function , Symbol , null….);
3:通过Map中的size属性, 可以很方便地获取到Map长度, 要获取Object的长度, 你只能用别的方法了;
Map实例对象的key值可以为一个数组或者一个对象,或者一个函数,比较随意 ,而且Map对象实例中数据的排序是根据用户push的顺序进行排序的, 而Object实例中key,value的顺序就是有些规律了, (他们会先排数字开头的key值,然后才是字符串开头的key值);
相对来说,两者的区别应该很明显了,但是实际运行的性能,却不一样:下面是具体测试的代码,
系统:win10 1809
ide:vscode
node:10.x
代码:
let {datetimeUtils} = require('xmcommon');
const MM = 1000000;
const NN = 10000;
function initObject() {
let o = {};
for(let i = 0; i < MM; i++) {
o[i] = i;
}
return o;
}
function initMap() {
let m = new Map();
for(let i = 0; i < MM; i++) {
m.set(i, i);
}
return m;
}
let o = initObject();
let m = initMap();
let d1 = datetimeUtils.getNow();
for(let i = 0; i < MM; i++) {
for(let j = 0; j < NN; j++) {
let t = o[i];
}
}
let d2 = datetimeUtils.getNow();
for(let i = 0; i < MM; i++) {
for(let j = 0; j < NN; j++) {
let t = m.get(i);
}
}
let d3 = datetimeUtils.getNow();
let deta1 = d2 - d1;
let deta2 = d3 - d2;
console.log(`object:${deta1}, map:${deta2}`);
结果: