diff options
author | Peter Bengtsson <mail@peterbe.com> | 2020-12-08 14:42:52 -0500 |
---|---|---|
committer | Peter Bengtsson <mail@peterbe.com> | 2020-12-08 14:42:52 -0500 |
commit | 074785cea106179cb3305637055ab0a009ca74f2 (patch) | |
tree | e6ae371cccd642aa2b67f39752a2cdf1fd4eb040 /files/ru/web/javascript/guide/keyed_collections | |
parent | da78a9e329e272dedb2400b79a3bdeebff387d47 (diff) | |
download | translated-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.html | 172 |
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> |