请考虑以下代码段:
var a = {amount: 300}
var b = {amount: 250}
var c = {[a] : 'bla', [b]: 'blabla'};
console.log(c[a]);
它打印:
blabla
但是它不能打印:
bla
这是怎么回事?
答案 0 :(得分:5)
对象不能将其他对象作为其键。发生的事情是,由于a
是无效密钥,因此将调用其toString
方法,从而将a
转换为字符串。 [b]
也会发生相同的情况。因此,对于解释器来说,您实际上在做什么 看起来像这样:
var a = {amount: 300}
var b = {amount: 250}
var c = {['object Object'] : 'bla', ['object Object']: 'blabla'};
console.log(c);
如果要将对象用作键,则应改用Map
:
var a = {amount: 300}
var b = {amount: 250}
var c = new Map()
.set(a, 'bla')
.set(b, 'blabla');
console.log(c.get(a));
(地图可以将任何内容作为其键)
答案 1 :(得分:4)
当您尝试使用对象作为键时,它会被字符串化为"[object object]"
,并且 成为键。因此,您的c
对象只有一个键,因为它没有两个[object Object]
属性。
var a = {amount: 300}
var b = {amount: 250}
var c = {[a] : 'bla', [b]: 'blabla'};
// lets look at c's keys
console.log(Object.keys(c))
答案 2 :(得分:1)
您可以在对象上实现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,看起来它永远不会允许对象成为键。