在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左右,所以我不介意。再次感谢。