在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]
。