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

时间:2018-07-26 02:09:12

标签: 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

这是怎么回事?

3 个答案:

答案 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,看起来它永远不会允许对象成为键。