Встроенные в JavaScript итераторы можно получить и явным образом, без for..of , прямым вызовом Symbol.iterator . Например, этот код получает итератор для строки и вызывает его полностью «вручную»:
'use strict';
let str = "Hello";
// Делает то же, что и
// for (var letter of str) alert(letter);
let iterator = str[Symbol.iterator](); while(true) {
let result = iterator.next(); if (result.done) break;
alert(result.value); // Выведет все буквы по очереди
}
То же самое будет работать и для массивов.
Итого
Итератор – объект, предназначенный для перебора другого объекта.
У итератора должен быть метод next() , возвращающий объект {done: Boolean, value: any} , где value – очередное значение, а done: true в конце.
Метод Symbol.iterator предназначен для получения итератора из объекта. Цикл for..of делает это автоматически, но можно и вызвать его напрямую.
В современном стандарте есть много мест, где вместо массива используются более абстрактные «итерируемые» (со свойством Symbol.iterator ) объекты, например оператор spread ... .
Встроенные объекты, такие как массивы и строки, являются итерируемыми, в соответствии с описанным выше.
Set, Map, WeakSet и WeakMap
В ES‑2015 появились новые типы коллекций в JavaScript: Set , Map , WeakSet и WeakMap .
Map
Map – коллекция для хранения записей вида ключ:значение .
В отличие от объектов, в которых ключами могут быть только строки, в Map ключом может быть произвольное значение, например:
'use strict';
let map = new Map();
map.set('1', 'str1'); // ключ‐строка map.set(1, 'num1'); // число map.set(true, 'bool1'); // булевое значение
// в обычном объекте это было бы одно и то же,
// map сохраняет тип ключа alert( map.get(1) ); // 'num1'
alert( map.get('1') ); // 'str1' alert( map.size ); // 3
Как видно из примера выше, для сохранения и чтения значений используются методы get и set . И ключи и значения сохраняются «как есть», без преобразований типов.
Свойство map.size хранит общее количество записей в map .
Метод set можно чейнить:
map
.set('1', 'str1')
.set(1, 'num1')
.set(true, 'bool1');
При создании Map можно сразу инициализировать списком значений. Объект map с тремя ключами, как и в примере выше:
let map = new Map([ ['1', 'str1'],
[1, 'num1'],
[true, 'bool1']
]);
Аргументом new Map должен быть итерируемый объект (не обязательно именно массив). Везде утиная типизация, максимальная гибкость.
В качестве ключей map можно использовать и объекты:
'use strict';
let user = { name: "Вася" };
// для каждого пользователя будем хранить количество посещений let visitsCountMap = new Map();
// объект user является ключом в visitsCountMap
visitsCountMap.set(user, 123); alert( visitsCountMap.get(user) ); // 123
Использование объектов в качестве ключей – как раз тот случай, когда Map сложно заменить обычными объектами Object . Ведь для обычных объектов ключ может быть только строкой.
Методы для удаления записей:
Для проверки существования ключа:
map.has(key) – возвращает true , если ключ есть, иначе false .
Do'stlaringiz bilan baham: |