我应该在哪些情况下更喜欢ES6-maps而不是JavaScript-objects?

时间:2016-06-11 07:56:43

标签: javascript ecmascript-6

我目前正在学习使用ES6进入JavaScript的新语言功能。

JavaScript对象始终是我从其他语言中所知的哈希映射或关联数组。

现在语言有地图。但我问自己:是否真的存在使用对象作为数据结构来完成同样事情的情况?

好的......,地图有一些额外的舒适方法。然而:我无法弄清楚使用对象无法完成同样的用例。

有谁知道为什么地图已融入语言? 或者更好:任何人都可以向我展示一个用例,我会更好地使用地图而不是对象吗?

3 个答案:

答案 0 :(得分:2)

当您仅使用字符串作为键时,对象很好。但是地图会让您使用其他数据类型作为密钥。此外,当您迭代其键和值时,它们具有可预测的顺序(插入元素的顺序)。

Have a look at the MDN here for more information.

答案 1 :(得分:1)

通常都是关于更清洁的数据结构并使事情变得更容易。

下面是对比你可以用Map做什么以及你可以用普通对象做什么

ECMAScript 6

let s = new Set()
s.add("hello").add("goodbye")

let m = new Map()
m.set("hello", 42)
m.set(s, 34)
m.get(s) === 34
m.size === 2
for (let [ key, val ] of m.entries())
    console.log(key + " = " + val) 

ECMAScript 5

var s = {}; 
s["hello"] = true; s["goodbye"] = true;

var m = {};
m["hello"] = 42; 
// no equivalent in ES5 
// no equivalent in ES5
Object.keys(m).length === 2;
for (key in m) {
    if (m.hasOwnProperty(key)) {
        var val = m[key];
        console.log(key + " = " + val);
    }
}

答案 2 :(得分:0)

如果您将对象用作地图,则键可能会与对象的内置属性发生冲突。当从用户或某些外部源读取密钥时,这可能是一个问题。

var a = {};

// Put value in map
a['hasOwnProperty'] = 1;

for(x in a) {
    // TypeError: a.hasOwnProperty is not a function
    if(a.hasOwnProperty(x)) {
        console.log(x);
    }
}