Javascript 地图在Ecmascript 6中如何使用对象键?

Javascript 地图在Ecmascript 6中如何使用对象键?,javascript,dictionary,ecmascript-6,Javascript,Dictionary,Ecmascript 6,我一直在研究ES6中即将推出的地图数据结构的规范。这应该很好,因为任何东西都可以是映射中的键,而不仅仅是字符串,但是当我尝试使用一些对象示例时,我无法检索插入到映射中的值 var _projects = new Map(); _projects.set({}, [...]); _projects.set({page: 2}, [...]); _projects.has({page:2}) false 然后我在网站上看到: 密钥相等基于“相同值”算法:考虑NaN 与Na

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

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



  _projects.has({page:2})
  false
然后我在网站上看到:

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


如果是这种情况,那么如果我想根据对象的值而不是其标识来检索对象的值,我的选项是什么?

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

你必须参考他们

这意味着您不能仅仅
\u 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
时,
\u projects
的键也会更新,但它感觉不对劲。为什么感觉不对劲。如果您
obj.x++
哪个是6,该对象也会在地图中更新,因为它是同一个对象?我不确定这是否适用于Map和Set,但是作为ES6内置,它们可能是子类化的github.com/lukehoban/es6features#子类化的内置-不久前有一篇关于子类化这些的帖子。如果你想通过值来识别对象,还有一大堆其他问题。我同意@picardo的观点,在java中,你可以通过使对象不可变来使用对象作为HashMaps中的键。然后你可以通过更改默认相等来检索它们,这可以通过覆盖“equals”方法来完成。有人在Javascript中找到了这样做的解决方案吗?对象是按身份而不是按值进行比较的。