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)。但我无法理解这里的概念。任何指导将不胜感激。
最佳答案
对象键必须是字符串(或符号),因此当您尝试使用对象作为键时,它首先将其转换为字符串表示形式,您看到的是“[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
object(去年在 ES6 中引入)部分是为了解决这个问题而设计的,如果你在 environment that supports its use 中运行,它允许你直接使用对象作为你的键。 .
关于javascript - 将键值对添加到 javascript 对象,其中 key 是一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37816752/