将对象用作贴图时,其键始终转换为字符串.为什么?

Fly*_*ura 0 javascript dictionary ecmascript-6

以下代码:

let user1={name: "Sam"};
let user2={name:"Tyler"};
let totalReplies={};
totalReplies[user1]=5;
totalReplies[user2]=42;
console.log(totalReplies[user1]);
console.log(totalReplies[user2]);
Run Code Online (Sandbox Code Playgroud)

生成输出:

42
42
Run Code Online (Sandbox Code Playgroud)

我期望输出为:

5
42
Run Code Online (Sandbox Code Playgroud)

阅读,我得到了' 当使用对象作为地图时,它的键总是转换为字符串 '.我不确定我是否理解这意味着什么或为什么对象键被转换为字符串.无论哪种方式,理解输出为42 42的原因应该有助于实施这一概念.

nil*_*ils 5

JavaScript对象仅支持字符串和符号作为键.

在这种情况下,JS将对象强制转换为字符串值(类似于[object Object]).

所以基本上你的代码就相当于:

let user1={name: "Sam"};
let user2={name:"Tyler"};
let totalReplies={};
totalReplies['[object Object]']=5;
totalReplies['[object Object]']=42;
console.log(totalReplies['[object Object]']);
console.log(totalReplies['[object Object]']);
Run Code Online (Sandbox Code Playgroud)

你可以在这里了解更多关于强制的信息:http: //webreflection.blogspot.ch/2010/10/javascript-coercion-demystified.html

如果需要在ES6 +中使用对象作为键,则可以使用Maps对象代替对象作为数据存储:

let user1={name: "Sam"};
let user2={name:"Tyler"};
let totalReplies = new Map();
totalReplies.set(user1, 5);
totalReplies.set(user2, 42);
console.log(totalReplies.get(user1));
console.log(totalReplies.get(user2));
Run Code Online (Sandbox Code Playgroud)