diff --git a/1-js/10-es-modern/10-set-map/article.md b/1-js/10-es-modern/10-set-map/article.md index f255d860..f7f3f51c 100644 --- a/1-js/10-es-modern/10-set-map/article.md +++ b/1-js/10-es-modern/10-set-map/article.md @@ -1,12 +1,12 @@ # Set, Map, WeakSet и WeakMap -Новые типы коллекций в JavaScript: `Set`, `Map`, `WeakSet` и `WeakMap`. +В ES-2015 появились новые типы коллекций в JavaScript: `Set`, `Map`, `WeakSet` и `WeakMap`. ## Map -`Map` -- коллекция для хранения записей вида `ключ: значение`. +`Map` -- коллекция для хранения записей вида `ключ:значение`. В отличие от объектов, в которых ключами могут быть только строки, в `Map` ключом может быть произвольное значение, например: @@ -16,23 +16,32 @@ let map = new Map(); -map.set('1', 'str1'); // строка -map - .set(1, 'num1') // число - .set(true, 'bool1'); // булевое +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`, причём `set` можно чейнить. И ключи и значения сохраняются "как есть", без преобразований типов. +Как видно из примера выше, для сохранения и чтения значений используются методы `get` и `set`. И ключи и значения сохраняются "как есть", без преобразований типов. Свойство `map.size` хранит общее количество записей в `map`. -**При создании `Map` можно сразу инициализовать списком значений.** +Метод `set` можно чейнить: + +```js +map + .set('1', 'str1') + .set(1, 'num1') + .set(true, 'bool1'); +``` + +При создании `Map` можно сразу инициализовать списком значений. Объект `map` с тремя ключами, как и в примере выше: @@ -44,9 +53,9 @@ let map = new Map([ ]); ``` -Аргументом `new Map` должен быть итерируемый объект (не обязательно именно массив), которые должен возвратить объект с ключами `0`,`1` -- также не обязательно массив. Везде утиная типизация, максимальная гибкость. +Аргументом `new Map` должен быть итерируемый объект (не обязательно именно массив). Везде утиная типизация, максимальная гибкость. -**В качестве ключей можно использовать и объекты:** +**В качестве ключей `map` можно использовать и объекты:** ```js //+ run @@ -54,6 +63,7 @@ let map = new Map([ let user = { name: "Вася" }; +// для каждого пользователя будем хранить количество посещений let visitsCountMap = new Map(); *!* @@ -65,12 +75,12 @@ alert( visitsCountMap.get(user) ); // 123 ``` [smart header="Как map сравнивает ключи"] -Для проверки значений на эквивалентность используется алгоритм [SameValueZero](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-samevaluezero). Он аналогичен строгому равенству `===`, отличие -- в том, что `NaN` считается равным `NaN`. +Для проверки значений на эквивалентность используется алгоритм [SameValueZero](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-samevaluezero). Он аналогичен строгому равенству `===`, отличие -- в том, что `NaN` считается равным `NaN`. Поэтому значение `NaN` также может быть использовано в качестве ключа. -Этот алгоритм жёстко фиксирован в стандарте, его нельзя изменять или задавать свою функцию для него. +Этот алгоритм жёстко фиксирован в стандарте, его нельзя изменять или задавать свою функцию сравнения. [/smart] -Для удаления записей: +Методы для удаления записей: -Ещё раз заметим, что используемый алгоритм сравнения ключей аналогичен `===`, за исключением `NaN`, которое равно самому себе: - -```js -//+ run -'use strict'; - -let map = new Map([ [NaN: 1] ]); - -alert( map.has(NaN) ); // true -alert( map.get(NaN) ); // 1 -alert( map.delete(NaN) ); // true -``` - ### Итерация -Для итерации используется один из трёх методов: +Для итерации по `map` используется один из трёх методов: