Различные способы добавления пары ключ / значение на карту в JavaScript - PullRequest
0 голосов
/ 05 сентября 2018

Согласно MDN set Method for Map , единственный способ добавить пару ключ / значение на карту в javascript - это метод set . Мне интересно, каково поведение карты, когда мы добавляем пару ключ / значение с квадратной скобкой, как показано ниже;

const testMap = new Map();
testMap.set( 1,"firstValue" );
testMap[2] = "secondValue";
console.log( testMap );
console.log( testMap[ 2 ] );
console.log( testMap[ '2' ] );

Кажется, что мы можем иметь вместе и карту, и объект! Может кто-нибудь объяснить это мне? Я знаю, что Map является своего рода объектом, но такое поведение может вызвать много ошибок. Есть ли способ предотвратить это? Кстати, если вы добавите пару ключ / значение с квадратными скобками , то вы не сможете использовать метод get для ее извлечения.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Это особая ситуация.

Карты - это особый случай, который содержит массив entries внутри. Когда вы используете нотацию массива, ваш ключ настройки / значения выходит за пределы этого entries массива.

Когда вы используете метод set или get, вы фактически используете внутренний массив entries, используемый кодом map.

enter image description here

Пример выше, по сути, создает объект Map, который использует внутренний массив entries. Однако установка второго объекта с использованием записи массива означает, что вы добавляете другую запись / свойство, но не в массиве Entries.

Кроме того, эти значения совершенно разные. Обратите внимание, что эти две структуры данных не сталкиваются. Поэтому testMap.get (2) - это не та же переменная, что и testMap [2].

0 голосов
/ 05 сентября 2018

Нет, ваш пример не работает должным образом, когда вы используете скобки, вы устанавливаете свойство для объекта testMap, не устанавливая запись. Вы можете подтвердить это, перебирая карту, используя, например, метод forEach.

const testMap = new Map();
testMap.set(1, "firstValue");
testMap[2] = "secondValue";

testMap.forEach(x => console.log(x));

Как видите, на консоли нет secondValue, то есть нет сопоставленной записи с этим значением. Поэтому он не был добавлен на карту, что когда-либо.

И, безусловно, testMap.set(1, "firstValue"); не эквивалентен testMap[1] = "firstValue";, единственная причина, по которой вам разрешено это делать, заключается в том, что javascript позволяет вам добавлять свойства к живым объектам, но не добавляется в записи карты.

Ссылка: Карта MDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...