【问题标题】:How do Maps work in Ecmascript 6 with Object keys?Maps 如何在 Ecmascript 6 中使用 Object 键工作?
【发布时间】:2015-03-14 19:27:52
【问题描述】:

我一直在研究 ES6 中即将推出的 Map 数据结构的规范。它应该很棒,因为任何东西都可以是 Map 中的键,而不仅仅是字符串,但是当我用一些对象示例尝试它时,我无法检索插入到 Map 中的值。

  var _projects = new Map();
  _projects.set({}, [...]);
  _projects.set({page: 2}, [...]);



  _projects.has({page:2})
  false

然后我在Mozilla developers 网站上看到了这个:

键相等基于“相同值”算法:考虑 NaN 与 NaN 相同(即使 NaN !== NaN),所有其他值都是 根据 === 运算符的语义认为相等。

如果是这种情况,如果我想根据对象的值而不是身份来检索对象的值,我有什么选择?

【问题讨论】:

  • 对象是按身份进行比较,而不是按值。

标签: javascript dictionary ecmascript-6


【解决方案1】:

记住{x:5} !== {x:5} 是真的,因为它们是两个不同的对象。

你必须引用它们。

这意味着你不能只是 _projects.has({x:5}),因为那是一个新对象。

您必须执行以下操作:

var _projects = new Map();
var obj = {x:5};
_projects.set(obj, [1,2]);

_projects.has(obj) //true;

【讨论】:

  • 但是如果你将obj.x 的值更新为6,这仍然返回true。这对我来说没有意义。直觉上,我可以理解,当你更改obj时,_projects的key也会更新,但就是感觉不对。
  • 为什么感觉不对。如果您obj.x++ 是 6,则该对象也会在地图中更新,因为那是同一个对象?什么不能得到,或者你想完成什么?
  • 我不确定这是否适用于 Map 和 Set,但是作为 ES6 内置,它们可能是子类 github.com/lukehoban/es6features#subclassable-built-ins - 前一阵子有一篇文章在子类化这些。但是,如果您要按值识别对象,那么还有很多其他问题。
  • 我同意@picardo,在java中,您可以通过使对象不可变来将对象用作HashMaps中的键。然后您可以通过更改默认相等来检索它们,这可以通过覆盖'equals'方法来完成.有人在 Javascript 中找到了解决方案吗?
猜你喜欢
  • 2023-03-13
  • 2015-09-14
  • 2014-07-23
  • 2015-04-07
  • 2016-01-17
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 2016-04-28
相关资源
最近更新 更多