【问题标题】:Using object as ES2015 map key使用对象作为 ES2015 映射键
【发布时间】:2016-09-08 07:56:53
【问题描述】:

我一直在尝试掌握 ES2015 地图概念,但我不明白的一件事是:

var mapRawObj = new Map();
var rawObj = {j:"I like penguin"};
mapRawObj.set(rawObj,true);
console.log(mapRawObj.get(rawObj)); //this outputs true

mapRawObj.set({j:"I like polar bear"},true);
console.log(mapRawObj.get({j:"I like polar bear"})); //this outputs undefined

第一个有效,第二个无效,我不明白为什么?

我认为当您将对象注册为键时,它是对象本身,而不是对象的名称。这就是为什么在下面的示例中,当您重新分配键对象时,它作为键失败?

var obj = { a:"hello ", b:"world "};
var mapObj = new Map();
mapObj.set(obj,true);
obj = {d:34}; //obj is re-assigned
console.log(mapObj.get(obj)); // outputs undefined

【问题讨论】:

  • 在第二个示例中,您基本上与第二个代码 sn-p 中的情况相同。因此,您要么都了解,要么都不了解。我很困惑。

标签: javascript dictionary ecmascript-6


【解决方案1】:

Javascript中数据相同的对象不相等,即

{ hello: 'world'} === { hello: 'world'} // false

第一个示例使用相同的对象作为 set 和 get 的键,因此键是相同的:

var obj = { hello: 'world'};
obj === obj // true

但第二个示例为get() 创建了一个新对象,该对象与用于在映射中设置值的键不同。由于它不相同,地图没有针对这个新键设置任何内容并返回undefined

即使新键与原始键具有完全相同的数据,但对象内部并未引用相同的数据。

More on object equality

【讨论】:

    猜你喜欢
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    相关资源
    最近更新 更多