将对象用作ES2015映射键

时间:2016-05-12 12:58:01

标签: javascript dictionary ecmascript-6

我一直试图抓住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

1 个答案:

答案 0 :(得分:5)

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

axis=

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

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

但是第二个示例为var obj = { hello: 'world'}; obj === obj // true 创建了一个新对象,该对象与用于在地图中设置值的键不同。由于它不相同,因此地图没有针对此新密钥设置任何内容并返回get()

即使新密钥与原始密钥具有完全相同的数据,对象也不会在内部引用相同的数据。

More on object equality