我目前正在学习使用ES6进入JavaScript的新语言功能。
JavaScript对象始终是我从其他语言中所知的哈希映射或关联数组。
现在语言有地图。但我问自己:是否真的存在使用对象作为数据结构来完成同样事情的情况?
好的......,地图有一些额外的舒适方法。然而:我无法弄清楚使用对象无法完成同样的用例。
有谁知道为什么地图已融入语言? 或者更好:任何人都可以向我展示一个用例,我会更好地使用地图而不是对象吗?
答案 0 :(得分:2)
当您仅使用字符串作为键时,对象很好。但是地图会让您使用其他数据类型作为密钥。此外,当您迭代其键和值时,它们具有可预测的顺序(插入元素的顺序)。
答案 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);
}
}