2016-05-12 2 views
2

Я пытался ухватить ES2015 карты концепции и одна вещь, которую я не понимаю, заключается в следующем:Использование объекта в качестве 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 

Первый из них работает, второй один Безразлично 't, и я не понимаю, почему?

Я думал, что когда вы регистрируете объект как ключ, это сам объект, а не имя объекта. Вот почему в приведенном ниже примере, когда вы повторно назначаете ключевой объект, он не работает как ключ?

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 
+0

В вашем втором примере вы в основном имеют такую ​​же ситуацию, как в вашем втором фрагменте кода. Таким образом, либо вы понимаете оба, либо ни одно из них. Я смущен. – zeroflagL

ответ

4

объектов с теми же данными, не равны в Javascript, т.е.

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

Первый пример использует один и тот же объект в качестве ключа для набора и получить, таким образом, ключ идентичен:

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

Но второй пример создает новый объект для get(), который не идентичен ключу, используемому для установки значения на карте. Так как это не идентично, карта не имеет ничего, что было бы против этого нового ключа, и возвращает undefined.

Даже если новый ключ имеет те же данные, что и исходный ключ, объекты не относятся к одним и тем же данным внутри.

More on object equality

+0

Спасибо, что очищает все – bastole

Смежные вопросы