向javascript对象添加键值对,其中键是一个对象

向javascript对象添加键值对,其中键是一个对象,javascript,javascript-objects,Javascript,Javascript Objects,1) 我试图向JS普通对象添加一系列键值对,其中键本身就是一个对象。每次添加键值对时,对象都会被覆盖(请参见live) 控制台输出: "[object Object]" "meow" "dog" "bhow" "cat" "meow" 2) 当键是字符串时,不会发生这种(覆盖行为)(请参阅live) 控制台输出: "[object Object]" "meow" "dog" "bhow" "cat" "meow" 想知道为什么会发生这种情况吗 我通过检查其他问题找到了一些解决方案()。但

1) 我试图向JS普通对象添加一系列键值对,其中键本身就是一个对象。每次添加键值对时,对象都会被覆盖(请参见live)

控制台输出:

"[object Object]"
"meow"
"dog"
"bhow"
"cat"
"meow"
2) 当键是字符串时,不会发生这种(覆盖行为)(请参阅live)

控制台输出:

"[object Object]"
"meow"
"dog"
"bhow"
"cat"
"meow"
想知道为什么会发生这种情况吗


我通过检查其他问题找到了一些解决方案()。但我无法理解这里的概念。任何指导都将不胜感激。

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

但是,您可以通过覆盖对象上的
toString
函数来执行您希望执行的操作,只要您为每个对象返回一个唯一的字符串(可能作为对象内容的散列),您的代码将按预期工作,因为它将使用该
toString
函数来获取对象的字符串表示形式,并以此为关键:

var x={};
变量y={
'name':'cat',
‘注意’:‘懒惰的动物’,
toString:function(){
返回“yobj”;
}
};
变量yy=‘喵喵’;
x[{
“name”:“dog”,
‘注意’:‘忠诚的动物’,
toString:function(){
返回'xobj';
}
}]='bhow';
x[y]=yy;
for(x中的变量k){
控制台日志(k);
console.log(x[k]);

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

但是,您可以通过覆盖对象上的
toString
函数来执行您希望执行的操作,只要您为每个对象返回一个唯一的字符串(可能作为对象内容的散列),您的代码将按预期工作,因为它将使用该
toString
函数来获取对象的字符串表示形式,并以此为关键:

var x={};
变量y={
'name':'cat',
‘注意’:‘懒惰的动物’,
toString:function(){
返回“yobj”;
}
};
变量yy=‘喵喵’;
x[{
“name”:“dog”,
‘注意’:‘忠诚的动物’,
toString:function(){
返回'xobj';
}
}]='bhow';
x[y]=yy;
for(x中的变量k){
控制台日志(k);
console.log(x[k]);

}
每当您将某个内容传递给对象的属性访问器时(对象[…])语法),它就会转换为字符串(请参见“属性名称”下的内容)


像您正在使用的普通Javascript对象一样,使用方法将其类型转换为字符串,该方法只返回
“[object object]”
。这就是为什么它们最终都指向相同的值。

每当您将某个内容传递给对象的属性访问器(对象[…]的
语法)时,它就会转换为字符串(请参见“属性名称”下的内容)


像您正在使用的普通Javascript对象一样,使用方法将其类型转换为字符串,该方法只返回
“[object object]”
。这就是为什么它们最终都指向相同的值。

你不能。对象键只能是字符串或符号。你想要张地图。对象键应该是字符串。此外,在第二个示例中,您没有指定相同的键,因此显然不会有任何覆盖?您不能。对象键只能是字符串或符号。你想要张地图。对象键应该是字符串。此外,在第二个示例中没有指定相同的键,因此显然不会有任何覆盖?