我不明白为什么输出是456.我认为[b]中的b是对象的属性,而c是a的另一个属性。它们根本不与var b和c相关。但为什么a.c覆盖a.b?
var a={},
b={key:'b'},
c={key:'c'};
a[b]=123;
a[c]=456;
console.log(a[b] === 456); //true
答案 0 :(得分:22)
这是因为属性名称是字符串,但您的b
和c
是对象。因此,它们是字符串化的:
b + ''; // "[object Object]"
c + ''; // "[object Object]"
b + '' === c + ''; // true
由于它们成为相同的字符串,因此会覆盖初始值。
相反,您可以考虑使用ECMAScript 6 Maps,它允许您使用任何值作为键:
var a = new Map(),
b = {key: 'b'},
c = {key: 'c'};
a.set(b, 123);
a.set(c, 456);
a.get(b); // 123
答案 1 :(得分:5)
您的密钥正在转换为字符串。字符串表示为"[object Object]"
。你在这两种情况下所做的就是:
a["[object Object]"] = 123;
a["[object Object]"] = 456;
证明:
var a={},
b={key:'b'},
c={key:'c'};
a[b]=123;
a[c]=456;
console.log(Object.keys(a));

答案 2 :(得分:0)
Orial是对的。 JS最麻烦的是变量的数据类型在声明中并不清楚,虽然有时方便。
在这种情况下,即使您尝试[a] == 456,也显示为真。
a首先被初始化为一维数组,当你尝试将它用作地图或键值时,你可能会遇到这样的错误。