将键值对添加到key为对象的javascript对象

时间:2016-06-14 15:51:57

标签: javascript javascript-objects

1)我试图将一系列键值对添加到JS普通对象,其中键本身是一个对象。每次添加键值对时,都会覆盖该对象(请参阅实时here)。

var x = {};

var y = {
  'name': 'cat',
  'note': 'lazy animal'
}
var yy = 'meow'

x[{
  'name': 'dog',
  'note': 'loyal animal'
}] = 'bhow'
x[y] = yy

for(var k in x) {
  console.log(k);
  console.log(x[k]);
}

控制台输出:

"[object Object]"
"meow"

2)当密钥是字符串时,不会发生这种(覆盖行为)(见实时here)。

var x = {};

var y = 'cat'
var yy = 'meow'

x['dog'] = 'bhow'
x[y] = yy

for(var k in x) {
  console.log(k);
  console.log(x[k]);
}

控制台输出:

"dog"
"bhow"
"cat"
"meow"

想了解为什么会这样?

通过查看其他问题(here),我想出了一些解决方案。但我无法理解这里的概念。任何指导都将非常感谢。

2 个答案:

答案 0 :(得分:0)

对象键必须是字符串(或符号),因此当您尝试将对象用作键时,它首先将其转换为字符串表示形式,您看到它是"[object Object]"

可以通过覆盖对象上的toString函数来执行你想做的事情,只要你为每个对象返回一个唯一的字符串(也许作为哈希值)对象的内容),您的代码将按预期工作,因为它将使用toString函数来获取对象的字符串表示形式,并将其用作键:

var x = {};

var y = {
  'name': 'cat',
  'note': 'lazy animal',
  toString: function() {
    return 'yobj';
  }
};
var yy = 'meow';

x[{
  'name': 'dog',
  'note': 'loyal animal',
  toString: function() {
    return 'xobj';
  }
}] = 'bhow';
x[y] = yy;

for (var k in x) {
  console.log(k);
  console.log(x[k]);
}

正如Jared在his comment中提到的,Map对象(去年在ES6中引入)部分旨在解决此问题,并允许您直接使用对象作为键,如果你是在environment that supports its use中运行。

答案 1 :(得分:0)

每次将某些内容传递给对象的属性访问器(object[...]语法)时,它都会转换为字符串(请参阅&{34;属性名称"下的here)。

使用the default toString()方法将简单的Javascript对象(例如您正在使用的对象)转换为字符串,只返回"[object Object]"。这就是他们最终都指向相同价值的原因。