在JavaScript中可以将对象作为另一个对象的键使用吗?
JavaScript普通对象能否使用对象作为键
普通JavaScript对象的键仅支持字符串和Symbol两种类型,确实无法直接将对象本身作为键使用。
第一段代码的运行逻辑
你写的numberOfAnswers[user1]赋值操作执行时,JS会自动将非字符串/ Symbol类型的键调用toString()方法转为字符串。普通对象调用toString()的默认返回值是"[object Object]",所以你这段代码本质是给numberOfAnswers新增了一个名为"[object Object]"的字符串键,和user1对象本身没有绑定关系。
你可以尝试新增另一个对象user2作为键赋值,会直接覆盖掉之前的234,就是因为两个对象转成字符串后都是同一个键。
let user1 = { name: "John Doe" }; let user2 = { name: "Jane Doe" }; let numberOfAnswers = {}; numberOfAnswers[user1] = 234; numberOfAnswers[user2] = 567; console.log(numberOfAnswers[user1]) // 输出567,被覆盖了
第二段代码的误解
你写的对象字面量{ user1: { visits: 123 } }里的user1只是一个字符串类型的键名,等价于"user1": { visits: 123 },和你之前声明的user1变量完全没有关联。
如果你想把变量的值作为键,ES6支持计算属性写法{ [user1]: { visits: 123 } },但即使这么写,普通对象还是会把user1转成"[object Object]"字符串作为键,依然无法实现用对象本身作为键的需求。
用对象作为键的正确方案
如果你确实需要将对象作为键,使用ES6新增的Map数据结构即可,Map的键支持任意JS类型,不会自动做类型转换:
let user1 = { name: "John Doe" }; let numberOfAnswers = new Map(); numberOfAnswers.set(user1, 234); console.log(numberOfAnswers.get(user1)) // 正常输出234
内容的提问来源于stack exchange,提问作者Tushar Roy
相关产品推荐
相关产品推荐

