You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:36:03