在JavaScript中将对象用作属性键

在JavaScript中将对象用作属性键,javascript,Javascript,这段代码是怎么回事 var a = {a:1}; var b = {b:2}; var c = {}; c[a] = 1; c[b] === 1 // true! c[b] = 2; c[a] === 2 // true! 具体来说,为什么在c中使用查找b返回存储在a属性中的值 在JavaScript中使用对象作为属性的键意味着什么 我已经在Chrome/Node和Firefox中对此进行了测试 在JavaScript中使用对象作为属性的键意味着什么 Javascript对象只允许字符串键

这段代码是怎么回事

var a = {a:1};
var b = {b:2};
var c = {};

c[a] = 1;
c[b] === 1 // true!

c[b] = 2;
c[a] === 2 // true!
具体来说,为什么在
c
中使用查找
b
返回存储在
a
属性中的值

在JavaScript中使用对象作为属性的键意味着什么

我已经在Chrome/Node和Firefox中对此进行了测试

在JavaScript中使用对象作为属性的键意味着什么

Javascript对象只允许字符串键,因此您的对象将首先被强制为字符串

具体来说,为什么在c中使用查找b返回存储在a的属性中的值

{a:1}
{b:2}
的字符串表示形式都是
“[object object]”
,因此,属性被覆盖

编辑:如果您确实需要使用对象作为键(如果可能,我更喜欢另一种解决方案),您可以使用对象的JSON表示:

c[JSON.stringify(a)] = 1
c[JSON.stringify(b)] = 2

但是,再次尝试另一种方法。除了对象本身,对象可能还有唯一的标识符。

为什么要将对象用作键, 键正在成为
对象.toString()
的结果,即
[object object]


因此,您要做的是为属性
“[Object Object]”
,设置一个值,并通过属性
“[Object Object]”

获取该值。当前javascript不支持将Object作为键,它可能会获得将成为[Object Object]的相干(转换为)字符串并存储值,因此它将每个对象都作为一个键,但在将来,“Map”可以用来将对象存储为键。听起来很有趣@Sushil。你有关于这个潜在的未来地图类的参考资料吗?几分钟的搜索之后,我在任何地方都找不到它。这是ECMAScript 6的未来实现,这里有一个非常好的WeakMap概念(我个人很喜欢),在这里你可以读到关于itThanks@Sushil,太棒了:)谢谢Linus,这很有意义。在某种意义上,我确实需要使用对象作为键,因此实际的
Map
类将非常有用。但是,我的集合中不会有太多,所以我想我将创建一个键/值对数组,然后在“get”循环中通过它们,使用
==
测试键。它将是O(N),但我的N将在10左右,所以我不介意。再次感谢。