@Ivanushka255

Почему for..in не работает для коллекции Map?

Цикл for..in не работает для коллекций Map и Set.

Почему цикл не работает для Set понятно. В переменную цикла for..in присваивается ключ, а ключей у данной коллекции нет.
let set = new Set([233, 'string', {key: 'value'}]);
for(let key in set) {
    console.log(key); //у Set нет ключей
};

А вот с Map непонятно. У Map есть ключи, почему не запускается цикл for..in?
let map = new Map([['key', 'value']]);
for(let key in map) {
    console.log(key);
};


А на чем вообще работает цикл for..in? for..of, к примеру, работает только с итерируемыми типами данных (т.е. с теми, у которых есть ф-ция Symbol.iterator). Возможно, что у Map и Set просто нет какой-то ф-ции, которая дает возможность запуститься этому циклу. Как это вообще происходит?
  • Вопрос задан
  • 171 просмотр
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Документация (только англоязычная версия) вроде бы, исчерпывающе объясняет:
The for...in statement iterates over all enumerable properties of an object
that are keyed by strings
(ignoring ones keyed by Symbols),
including inherited enumerable properties.


Ожидаются свойства-строки. Map заточен под другое и позволяет использовать в качестве ключей что угодно, в том числе объекты. Значения добавленные в Map – это не его свойства в привычном смысле.

Map, как и «всё в JavaScript» — объект. Поэтому можно взять и назначить ему свои свойства. Вот они вполне себе попадут в перечислёж for..in:
const m = new Map();
m.set({}, 'obj');
m.set('a', 'A');

// это другое
m.b = 'B';

for (let prop in m) {
  console.log('property', prop);
}

// property b
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы