You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/05-data-types/07-map-set-weakmap-weakset/article.md
+20-20Lines changed: 20 additions & 20 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,5 @@
1
1
2
-
# Map, Set, WeakMap and WeakSet
2
+
# Map, Set, WeakMap и WeakSet
3
3
4
4
Сейчас мы знаем о следующих сложных структурах данных:
5
5
@@ -10,29 +10,29 @@
10
10
11
11
## Map
12
12
13
-
[Map](mdn:js/Map) это коллекция именованных элементов, как и `Object`. Но основное отличие в том что `Map` позволяет использовать ключи любого типа.
13
+
[Map](mdn:js/Map)-- это коллекция именованных элементов, как и `Object`. Но основное отличие в том, что `Map` позволяет использовать ключи любого типа.
14
14
15
15
Основные методы объекта:
16
16
17
17
-`new Map()` -- создаёт объект (коллекцию) Map.
18
-
-`map.set(key, value)` -- устанавливает значение `value` элемента по его ключу `key`.
19
-
-`map.get(key)` -- возвращает значение по ключу или `undefined` если ключ`key` не присутствует в объекте Map.
20
-
-`map.has(key)` -- возвращает `true` если `key` присутствует в Map или `false` в обратном случае.
18
+
-`map.set(key, value)` -- устанавливает элементу с ключём `key` значение `value`.
19
+
-`map.get(key)` -- возвращает значение по ключу или `undefined`, если ключ`key` не присутствует в объекте `Map`.
20
+
-`map.has(key)` -- возвращает `true`, если `key` присутствует в Map или `false` в обратном случае.
21
21
-`map.delete(key)` -- удаляет элемент по ключу `key`.
22
-
-`map.clear()` -- очищает объект Map от всех элементов
22
+
-`map.clear()` -- очищает объект `Map` от всех элементов
23
23
-`map.size` -- возвращает текущее количество элементов.
24
24
25
25
Например:
26
26
27
27
```js run
28
28
let map =newMap();
29
29
30
-
map.set('1', 'str1'); //строка в качестве ключа
31
-
map.set(1, 'num1'); //цифра как ключ
32
-
map.set(true, 'bool1'); // булевое значение как ключ
30
+
map.set('1', 'str1'); //строка в качестве ключа
31
+
map.set(1, 'num1'); //цифра как ключ
32
+
map.set(true, 'bool1'); //булево значение как ключ
33
33
34
34
// помните обычный объект `Object`? Он приводит ключи к строкам
35
-
// Map сохраняет тип ключей, так что в этом случае хранится 2 разных значения:
35
+
// Map сохраняет тип ключей, так что в этом случае сохранится 2 разных значения:
36
36
alert(map.get(1)); // 'num1'
37
37
alert(map.get('1')); // 'str1'
38
38
@@ -47,16 +47,16 @@ alert(map.size); // 3
47
47
```js run
48
48
let john = { name:'John' };
49
49
50
-
// давайте хранить количество посещений для каждого пользователя
50
+
// давайте сохраним количество посещений для каждого пользователя
51
51
let visitsCountMap =newMap();
52
52
53
-
// объект john это ключ для значения в объекте Map
53
+
// объект john -- это ключ для значения в объекте Map
54
54
visitsCountMap.set(john, 123);
55
55
56
56
alert(visitsCountMap.get(john)); // 123
57
57
```
58
58
59
-
Использование объектов в качестве ключей это одна из известных и часто применимых возможностей объекта `Map`. Для использования строковых ключей, объекта `Object` может быть достаточно, но будет достаточно сложно найти способ заменить объект `Map` обычным объектом `Object` в примере выше.
59
+
Использование объектов в качестве ключей -- это одна из известных и часто применяемых возможностей объекта `Map`. Для использования строковых ключей объекта `Object` может быть достаточно, но будет достаточно сложно найти способ заменить объект `Map` обычным объектом `Object` в примере выше.
60
60
61
61
Например:
62
62
@@ -68,12 +68,12 @@ let visitsCountObj = {}; // попробуем использовать объе
68
68
visitsCountObj[john] =123; // пробуем использовать объект john как ключ
Так как `john` это объект, он был преобразован в строку `"[object Object]"`. Все объекты без специальной обработки подобных преобразований приводятся к подобной строке, так что будьте внимательны чтобы случайно всё не испортить.
76
+
Так как `john`-- это объект, он был преобразован в строку `"[object Object]"`. Все объекты без специальной обработки подобных преобразований приводятся к подобной строке, так что будьте внимательны, чтобы случайно всё не испортить.
77
77
78
78
Давным-давно, до появления `Map`, люди добавляли уникальные идентификаторы примерно таким образом:
```smart header="Как объект `Map` сравнивает ключи"
96
96
Чтобы проверить значения на равенство, объект `Map` использует алгоритм [SameValueZero](https://tc39.github.io/ecma262/#sec-samevaluezero). Это почти такое же сравнение что и `===`, с той лишь разницей что `NaN` считается равным `NaN`. Так что `NaN` так же может использоваться в качестве ключа.
97
97
98
-
Этот алгоритм не может быть заменен или модифицирован.
98
+
Этот алгоритм не может быть заменён или модифицирован.
99
99
```
100
100
101
101
@@ -123,7 +123,7 @@ let map = new Map([
123
123
]);
124
124
```
125
125
126
-
Существует встроенный метод [Object.entries(obj)](mdn:js/Object/entries) который возвращает массив пар ключ-значение из содержимого переданного объекта как раз в нужном формате.
126
+
Существует встроенный метод [Object.entries(obj)](mdn:js/Object/entries), который возвращает массив пар ключ-значение из содержимого переданного объекта как раз в нужном формате.
127
127
128
128
Так что мы можем создать объект Map из объекта следующим образом:
- `new Set(iterable)` -- создает объект Set, и если в качестве аргумента был предоставлен итерируемый объект (обычно это массив), то копирует его значения в новый объект Set.
193
193
- `set.add(value)` -- добавляет значение, возвращается тот же объект set.
194
194
- `set.delete(value)` -- удаляет значение, возвращает `true` если `значение` было в объекте Set в момент вызова, иначе `false`.
195
-
- `set.has(value)` -- возвращает `true` если значение присутствует в объекте Set, иначе `false`.
195
+
- `set.has(value)` -- возвращает `true`, если значение присутствует в объекте Set, иначе `false`.
196
196
- `set.clear()` -- удаляет все имеющиеся значения.
197
197
- `set.size` -- возвращает количество элементов в объекте Set.
198
198
@@ -269,7 +269,7 @@ john = null;
269
269
*/!*
270
270
```
271
271
272
-
Обычно свойство объекта, элемента массива или другой структуры данных считаются достижимыми и сохраняются в памяти до тех пор пока структура данных содержится в памяти.
272
+
Обычно свойство объекта, элемента массива или другой структуры данных считаются достижимыми и сохраняются в памяти до тех пор, пока структура данных содержится в памяти.
273
273
274
274
Например, если мы поместим объект в массив, то до тех пор пока массив существует, объект также будет существовать в памяти, несмотря на то что других ссылок на него нет.
275
275
@@ -405,7 +405,7 @@ john = null;
405
405
// так что объект будет автоматически удалён и из памяти и из коллекции visitsCountMap
406
406
```
407
407
408
-
С обычным `Map`, очистка памяти после того как пользователь ушел может быть утомительной задачей: нам не только нужно удалить пользователя из главного хранилища (он может быть как в переменной так и в массиве), но также очистить и другие места хранения ссылки на этот объект, как например `visitsCountMap`. И это решение может стать более громоздким в более сложных случаях, когда поведение пользователей отслеживается в одном месте, а дополнительные структуры в другом, и у нас нет информации об удалении пользователя.
408
+
С обычным `Map`, очистка памяти после того как пользователь ушёл может быть утомительной задачей: нам не только нужно удалить пользователя из главного хранилища (он может быть как в переменной так и в массиве), но также очистить и другие места хранения ссылки на этот объект, как например `visitsCountMap`. И это решение может стать более громоздким в более сложных случаях, когда поведение пользователей отслеживается в одном месте, а дополнительные структуры в другом, и у нас нет информации об удалении пользователя.
409
409
410
410
```summary
411
411
`WeakMap` может сделать вашу жизнь проще, потому как он очищается автоматически. Данные в нем, как пользователи в примере выше, хранятся автоматически до тех пор, пока существует объект используемый в качестве ключа.
0 commit comments