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),我想出了一些解决方案。但我无法理解这里的概念。任何指导都将非常感谢。
答案 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]"
。这就是他们最终都指向相同价值的原因。