aboutsummaryrefslogtreecommitdiff
path: root/files/ru/web/javascript/guide/keyed_collections
diff options
context:
space:
mode:
authorPeter Bengtsson <mail@peterbe.com>2020-12-08 14:42:52 -0500
committerPeter Bengtsson <mail@peterbe.com>2020-12-08 14:42:52 -0500
commit074785cea106179cb3305637055ab0a009ca74f2 (patch)
treee6ae371cccd642aa2b67f39752a2cdf1fd4eb040 /files/ru/web/javascript/guide/keyed_collections
parentda78a9e329e272dedb2400b79a3bdeebff387d47 (diff)
downloadtranslated-content-074785cea106179cb3305637055ab0a009ca74f2.tar.gz
translated-content-074785cea106179cb3305637055ab0a009ca74f2.tar.bz2
translated-content-074785cea106179cb3305637055ab0a009ca74f2.zip
initial commit
Diffstat (limited to 'files/ru/web/javascript/guide/keyed_collections')
-rw-r--r--files/ru/web/javascript/guide/keyed_collections/index.html172
1 files changed, 172 insertions, 0 deletions
diff --git a/files/ru/web/javascript/guide/keyed_collections/index.html b/files/ru/web/javascript/guide/keyed_collections/index.html
new file mode 100644
index 0000000000..2b2d128801
--- /dev/null
+++ b/files/ru/web/javascript/guide/keyed_collections/index.html
@@ -0,0 +1,172 @@
+---
+title: Коллекции
+slug: Web/JavaScript/Guide/Keyed_collections
+tags:
+ - коллекции
+ - словари
+ - структура данных
+translation_of: Web/JavaScript/Guide/Keyed_collections
+---
+<div>{{jsSidebar("JavaScript Guide")}} {{PreviousNext("Web/JavaScript/Guide/Indexed_Collections", "Web/JavaScript/Guide/Working_with_Objects")}}</div>
+
+<p class="summary">Этот раздел содержит обзор коллекций {{jsxref("Set")}} и словарей {{jsxref("Map")}} - встроенных {{Glossary("Data_structure","структур данных")}} с доступом по ключу.</p>
+
+<h2 id="Словари">Словари</h2>
+
+<h3 id="Тип_Map"><code>Тип Map</code> </h3>
+
+<p>{{jsxref("Map")}} - реализация простого ассоциативного массива (словаря). Он содержит данные в виде набора пар ключ/значение(ключи уникальны) и предоставляет методы для доступа и манипулирования этими данными.  </p>
+
+<p>Также как и {{jsxref("Object", "объект", "", 1)}}, словарь позволяет</p>
+
+<ul>
+ <li>получать значение  по ключу, а также проверять наличие ключа</li>
+ <li>добавлять/удалять пары ключ/значение</li>
+ <li>перезаписывать значение по ключу (ключи уникальны).</li>
+ <li>итерироваться по ключам</li>
+</ul>
+
+<p>Словари, как специализированная структура данных, имеют существенные преимущества по сравнению с объектами<font face="Consolas, Liberation Mono, Courier, monospace">:</font></p>
+
+<ul>
+ <li>Ключи словаря могут быть любого типа (а не только строки).</li>
+ <li>Словарь хранит свой размер (не надо вычислять).</li>
+ <li>Натуральный порядок обхода элементов ( в порядке добавления) с помощью {{jsxref("Statements/for...of","for...of")}}.</li>
+ <li>Словарь не подмешивает ключи из прототипа (в отличие от объекта).</li>
+</ul>
+
+<p>В следующем примере приведены основные операции со словарём:</p>
+
+<pre class="brush: js">var sayings = new Map();
+sayings.set("dog", "woof");
+sayings.set("cat", "meow").set("elephant", "toot");
+//вызов функции .set возвращает Map, поэтому set можно объединять в цепочки
+
+sayings.set("dog", "гав-гав"); // заменить значение по ключу
+
+sayings.size; // 3
+sayings.get("fox"); // undefined
+sayings.has("bird"); // false
+sayings.delete("dog");
+
+for (var [key, value] of sayings) {
+  console.log(key + " goes " + value);
+}
+// "cat goes meow"
+// "elephant goes toot"
+</pre>
+
+<p>Больше примеров и полное описание на странице справочника {{jsxref("Map")}} .</p>
+
+<h3 id="Тип_WeakMap"><code>Тип WeakMap</code> </h3>
+
+<p>{{jsxref("WeakMap")}} это специальный вид словаря, <strong>ключами которого могут быть только объекты</strong>, причём ссылки на них в WeakMap являются  <em>слабыми </em>(не учитываются  сборщиком мусора (garbage collector GC)).</p>
+
+<div class="note">
+<p>Интерфейс <code>WeakMap</code> совпадает с <code>Map</code>, единственное отличие - <strong>ключи <code>WeakMap</code> нельзя итерировать</strong> (т.e. нельзя получить список ключей). Это понятно, поскольку в таком случае возникла бы неопределённость с достоверностью этого списка в зависимости от состояния garbage collection.</p>
+</div>
+
+<p>Больше примеров, полное описание, а также обсуждение "Зачем <s>козе баян</s> <em>WeakMap</em>?"  на странице справочника {{jsxref("WeakMap")}}.</p>
+
+<p>Отметим, что <code>WeakMap,</code> в частности, может элегантно использоваться для упаковки приватных данных или деталей реализации. Следующий пример из статьи Nick Fitzgerald <a href="http://fitzgeraldnick.com/weblog/53/">"Hiding Implementation Details with ECMAScript 6 WeakMaps"</a>. Приватная часть сохраняется как значение в <code>privates</code> и имеет время жизни такое же как и сущность класса. Сам класс и его методы публичны; прочее недоступно извне модуля:</p>
+
+<pre class="brush: js">const privates = new WeakMap();
+
+export class Public() {
+
+  constructor() {
+ const me = {
+ // Приватные данные идут здесь
+ };
+  // 'me' будет освобождён вместе с 'this' !!!
+ privates.set(this, me);
+ }
+
+ method () {
+ const me = privates.get(this);
+ // Сделайте что-нибудь с приватными данными в 'me'...
+  }
+}
+</pre>
+
+<h2 id="Коллекции">Коллекции</h2>
+
+<h3 id="Тип_Set"><code>Тип Set</code> </h3>
+
+<p>{{jsxref("Set")}} реализация коллекции - структура данных, которая содержит список уникальных элементов в порядке их добавления. </p>
+
+<p>В следующем примере приведены основные операции по работе с коллекцией <code>Set:</code></p>
+
+<pre class="brush: js">var mySet = new Set();
+mySet.add(1);
+mySet.add("some text");
+mySet.add("foo");
+
+mySet.has(1); // true
+mySet.delete("foo");
+mySet.size; // 2
+
+for (let item of mySet) console.log(item);
+// 1
+// "some text"
+</pre>
+
+<p>Больше примеров и полное описание на странице справочника {{jsxref("Set")}}</p>
+
+<h4 id="Преобразования_между_Array_и_Set">Преобразования между Array и Set</h4>
+
+<p>Можно создать {{jsxref("Array")}} из Set с помощью {{jsxref("Array.from")}} или используя <a href="/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator">spread operator</a>.</p>
+
+<p>В свою очередь, конструктор <code>Set</code> может принимать <code>Array</code> в качестве аргумента.</p>
+
+<div class="note">
+<p>Поскольку <code>Set</code> структура работает с уникальными значениями, любые повторяющиеся элементы из Array будут проигнорированы.</p>
+</div>
+
+<pre class="brush: js">Array.from(mySet);
+[...mySet2];
+
+mySet2 = new Set([1,2,3,4]);
+</pre>
+
+<h4 id="Сравнение_Array_и_Set"><code>Сравнение Array</code> и <code>Set</code> </h4>
+
+<p>Словари, как специализированная структура данных, имеют существенные отличия по сравнению с массивами:</p>
+
+<ul>
+ <li>{{jsxref("Set.has")}} работает быстрее чем {{jsxref("Array.indexOf")}}.</li>
+ <li><font face="Consolas, Liberation Mono, Courier, monospace">можно удалять элементы по значению (а не по индексу как массивах)</font>.</li>
+ <li>{{jsxref("NaN")}} обрабатывается корректно.</li>
+ <li><font face="Consolas, Liberation Mono, Courier, monospace">поддерживается уникальность значений</font>.</li>
+</ul>
+
+<h3 id="Тип_WeakSet"><code>Тип WeakSet</code> </h3>
+
+<p>{{jsxref("WeakSet")}} это специальный вид коллекции, элементами которой могут быть только объекты. Ссылки на эти объекты в WeakSet являютя <em>слабыми </em>(не учитываются  сборщиком мусора (garbage collector GC)).</p>
+
+<div class="note">
+<p>Элементы <code>WeakSet</code> уникальны и могут быть добавлены только один раз, также как и в {{jsxref("Set")}}. </p>
+</div>
+
+<p>Основные отличия от {{jsxref("Set")}}:</p>
+
+<ul>
+ <li><code>WeakSet</code> это коллекция <em>объектов</em> ( примитивные значения не могут быть добавлены).</li>
+ <li><code>WeakSet</code> <em>нельзя итерировать</em>. А также нельзя получить список (итератор) элементов.</li>
+</ul>
+
+<p>Использование <code>WeakSet</code> достаточно специфическое. Пользуясь тем, что они не могут создавать утечек памяти, в них можно, например, безопасно помещать ссылки на DOM элементы.</p>
+
+<p>Больше примеров и полное описание на странице справочника {{jsxref("WeakSet")}}</p>
+
+<h2 id="Проверка_на_равенство_в_Map_и_Set">Проверка на равенство в <code>Map</code> и <code>Set</code></h2>
+
+<p>Сравнение на равенство ключей в <code>Map</code> objects или объектов в <code>Set</code> основано на "<a href="https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero">same-value-zero algorithm</a>":</p>
+
+<ul>
+ <li>алгоритм сравнения в целом совпадает с оператором <code>===</code>.</li>
+ <li><code>-0</code> и <code>+0</code> считаются равными (в отличие от <code>===</code>).</li>
+ <li>{{jsxref("NaN")}} считается равным самому себе (в отличие от <code>===</code>).</li>
+</ul>
+
+<p>{{PreviousNext("Web/JavaScript/Guide/Indexed_Collections", "Web/JavaScript/Guide/Working_with_Objects")}}</p>