在Javascript中将对象用作键时的奇怪行为

在Javascript中将对象用作键时的奇怪行为,javascript,dictionary,object,properties,key,Javascript,Dictionary,Object,Properties,Key,考虑以下代码段: var a = {amount: 300} var b = {amount: 250} var c = {[a] : 'bla', [b]: 'blabla'}; console.log(c[a]); 它打印: blabla 但如果它不打印: bla 这是怎么回事?当您尝试使用对象作为键时,它会被字符串化为类似于“[object object]”和的内容,从而成为键。因此,您的c对象只有一个键,因为它不能有两个[object object]属性 var a={amoun

考虑以下代码段:

var a = {amount: 300}
var b = {amount: 250}
var c = {[a] : 'bla', [b]: 'blabla'};
console.log(c[a]);
它打印:

blabla
但如果它不打印:

bla

这是怎么回事?

当您尝试使用对象作为键时,它会被字符串化为类似于
“[object object]”
的内容,从而成为键。因此,您的
c
对象只有一个键,因为它不能有两个
[object object]
属性

var a={amount:300}
变量b={金额:250}
变量c={[a]:'bla',[b]:'blabla'};
//让我们看看c的键

console.log(Object.keys(c))
对象不能将其他对象作为其键。发生的事情是,由于
a
是一个无效键,因此调用了它的
toString
方法,从而将
a
转换为字符串。同样的事情也发生在
[b]
上。所以,对于口译员来说,你所做的实际上是这样的:

var a={amount:300}
变量b={金额:250}
var c={['object']:'bla',['object']:'blabla'};

控制台日志(c)您可以在对象上实现
toString()
toString
是一个存在于所有JavaScript对象上的函数,它是在对象字符串化时调用的函数

您的
toString
实现必须生成唯一的值。类似于为对象创建哈希代码

var a = {amount: 300, toString: function() {return 'unique 1'}}
var b = {amount: 250, toString: function() {return 'unique 2'}}
var c = {[a] : 'bla', [b]: 'blabla'};
console.log(c[a]);

快速看一下IE11,它似乎永远不会允许对象成为键。

它首先转换为字符串(因为JS对象可能只有字符串键),这两个对象都是
[object object]