为什么[c]覆盖[b]?

时间:2015-03-26 18:14:19

标签: javascript object

我不明白为什么输出是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

3 个答案:

答案 0 :(得分:22)

这是因为属性名称是字符串,但您的bc是对象。因此,它们是字符串化的:

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首先被初始化为一维数组,当你尝试将它用作地图或键值时,你可能会遇到这样的错误。