【问题标题】:Using an object as a property key in JavaScript在 JavaScript 中使用对象作为属性键
【发布时间】:2012-09-12 10:45:26
【问题描述】:

这段代码发生了什么?

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 不支持将对象作为键,它可能会获得连贯(转换为)字符串,该字符串将是 [object Object] 并存储值,因此它为每个对象作为键提供 true,但将来“地图”是您可以用来将对象存储为键的东西。
  • 听起来很有趣@Sushil。你有关于这个潜在的未来 Map 类的信息的参考吗?经过几分钟的搜索,我在任何地方都找不到它。
  • 它是 ECMAScript 6 的未来实现 developer.mozilla.org/en-US/docs/JavaScript/Reference/… 这里你去,另外还有一个非常好的 WeakMap 概念(我个人喜欢它)developer.mozilla.org/en-US/docs/JavaScript/Reference/… 这里你可以阅读它
  • 谢谢@Sushil,太好了:)

标签: javascript


【解决方案1】:

在 JavaScript 中使用对象作为属性的键是什么意思?

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

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

{a: 1}{b: 2} 的字符串表示都是 "[object Object]",因此,该属性被覆盖。

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

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

但是,再次尝试考虑不同的方法。可能对象具有除对象本身之外的唯一标识符。

【讨论】:

  • 干杯莱纳斯,这很有道理。从某种意义上说,我确实需要将对象用作键,因此实际的 Map 类会很有用。但是我的集合中不会有很多,所以我想我将创建一个键/值对数组,并在“获取”循环中遍历它们,使用=== 测试键。这将是 O(N),但我的 N 将在 10 左右,所以我不介意。再次感谢。
【解决方案2】:

为什么要使用对象作为键, 关键是成为object.toString() 的结果,即[Object Object]

所以你正在做的是给属性"[Object Object]"设置一个值,然后通过属性"[Object Object]"获取值。

【讨论】:

    猜你喜欢
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 2022-09-23
    • 1970-01-01
    • 2018-05-07
    • 2019-08-27
    相关资源
    最近更新 更多