JavaScript 开发中,为何不该把对象当 Map 用
在 JavaScript 开发中,我们经常习惯性地使用对象(Object)来存储键值对数据。从表面看,它和 Map 很像,都是 key-value 结构。但两者真的可以互换吗?
结论先行:JavaScript 中的对象是糟糕的 Map。 它只能使用字符串作为 key,并且存在访问原型属性的风险。因此,建议优先使用内置的 Map 集合。
访问原型属性的风险
由于 JavaScript 的原型机制,对象默认继承自 Object.prototype。这意味着如果你访问一个不存在的键,可能会意外获取到原型链上的属性。
const dictionary = { zh: { name: '姓名' }, en: { name: 'Name' } }
typeof dictionary.zh['constructor'] === 'undefined' // false
// 输出:"ƒ Object() { [native code] }"
这是因为 constructor 本身就是原型对象的属性。当做 Map 使用时,如果不小心访问了这些保留字,就会造成逻辑混乱,务必格外注意。
只能字符串作为 key 的风险
对象的所有键最终都会被转换为字符串。当你尝试使用非字符串类型(比如对象、DOM 元素)作为键时,它们会经过 toString() 处理,这极易导致键冲突。
假设我们有以下 HTML 结构:
<p id="first"></p>
<p id="second"></p>
当我们试图用这两个 DOM 元素作为键存入对象时:
const map = {}
const firstElement = document.querySelector('#first')
const secondElement = document.querySelector('#second')
map[firstElement] = {data: }
map[secondElement] = {: }

