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/reference/global_objects/set/index.html | |
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/reference/global_objects/set/index.html')
-rw-r--r-- | files/ru/web/javascript/reference/global_objects/set/index.html | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/files/ru/web/javascript/reference/global_objects/set/index.html b/files/ru/web/javascript/reference/global_objects/set/index.html new file mode 100644 index 0000000000..0233c7fcb5 --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/set/index.html @@ -0,0 +1,242 @@ +--- +title: Set +slug: Web/JavaScript/Reference/Global_Objects/Set +tags: + - ECMAScript6 + - JavaScript + - set + - Экспериментальный +translation_of: Web/JavaScript/Reference/Global_Objects/Set +--- +<div>{{JSRef("Global_Objects", "Set")}}</div> + +<h2 id="Сводка">Сводка</h2> + +<p>Объекты <strong><code>Set</code></strong> позволяют вам сохранять <em>уникальные</em> значения любого типа, как {{Glossary("Primitive", "примитивы")}}, так и другие типы объектов.</p> + +<h2 id="Синтаксис">Синтаксис</h2> + +<pre class="syntaxbox"> new Set([iterable]);</pre> + +<h3 id="Параметры">Параметры</h3> + +<dl> + <dt>iterable</dt> + <dd>При передаче <a href="/ru/docs/Web/JavaScript/Reference/Statements/for...of">итерируемого объекта</a>, все его элементы будут добавлены в новый Set. Иначе (или при <code>null</code>) новый <code>Set</code> будет пуст.</dd> + <dt> + <h3 id="Возвращает">Возвращает</h3> + </dt> + <dd> + <p>Новый <code>Set</code> объект.</p> + </dd> +</dl> + +<h2 id="Описание">Описание</h2> + +<p>Объекты <code>Set</code> представляют коллекции значений, по которым вы можете выполнить обход в порядке вставки элементов. Значение элемента в <code>Set</code> может присутствовать <strong>только в одном экземпляре</strong>, что обеспечивает его уникальность в коллекции <code>Set</code>.</p> + +<h3 id="Сравнение_значений">Сравнение значений</h3> + +<p>Поскольку каждое значение в <code>Set</code> должно быть уникальным, сравнение значений основано на алгоритме "подобное значение": <code>NaN</code> равно <code>NaN</code> (несмотря на то, что <code>NaN !== NaN</code>); все другие значения рассматриваются равными исходя из семантики оператора строго равенства ===. В ранних версиях черновика ECMAScript 6 <code>-0</code> и <code>+0</code> считались разными (несмотря на то, что <code>-0 === +0</code>), это было изменено в последующих версиях и адаптировано в Gecko 29 {{geckoRelease("29")}} ({{bug("952870")}}) и <a href="https://code.google.com/p/v8/issues/detail?id=3069">последней ночной сборке Chrome</a>. <code>NaN</code> и <code>undefined</code> также могут сохраняться в <code>Set</code>.</p> + +<h2 id="Properties" name="Properties">Свойства</h2> + +<dl> + <dt><code>Set.length</code></dt> + <dd>Значение свойства <code>length</code> всегда равно 0.</dd> + <dd>Чтобы узнать количество элементов в <code>Set</code>, используйте {{jsxref("Set.prototype.size")}}.</dd> + <dt>{{jsxref("Set.@@species", "get Set[@@species]")}}</dt> + <dd>Функция-конструктор, которая используется для создания производных объектов.</dd> + <dt>{{jsxref("Set.prototype")}}</dt> + <dd>Представляет прототип конструктора <code>Set</code>. Позволяет добавлять свойства всем объектам типа <code>Set</code>.</dd> +</dl> + +<h2 id="Set_instances" name="Set_instances">Экземпляры <code>Set</code></h2> + +<p>Все экземпляры <code>Set</code> унаследованы от {{jsxref("Set.prototype")}}.</p> + +<h3 id="Свойства">Свойства</h3> + +<p>{{page('ru/Web/JavaScript/Reference/Global_Objects/Set/prototype','Properties')}}</p> + +<h3 id="Методы">Методы</h3> + +<p>{{page('ru/Web/JavaScript/Reference/Global_Objects/Set/prototype','Methods')}}</p> + +<h2 id="Примеры">Примеры</h2> + +<h3 id="Использование_объекта_Set">Использование объекта <code>Set</code></h3> + +<pre class="brush: js">var mySet = new Set(); + +mySet.add(1); // Set { 1 } +mySet.add(5); // Set { 1, 5 } +mySet.add(5); // Set { 1, 5 } +mySet.add("some text"); // Set { 1, 5, 'some text' } +var o = {a: 1, b: 2}; +mySet.add(o); + +mySet.add({a: 1, b: 2}); // переменная o связана с другим объектом, поэтому данная строка также сработает + +mySet.has(1); // true +mySet.has(3); // false, 3 не было добавлено в set +mySet.has(5); // true +mySet.has(Math.sqrt(25)); // true +mySet.has("Some Text".toLowerCase()); // true +mySet.has(o); // true + +mySet.size; // 5 + +mySet.delete(5); // удаляет 5 из set +mySet.has(5); // false, 5 было удалено + +mySet.size; // 4, было удалено одно значение +console.log(mySet); // Set {1, 'some text', Object {a: 1, b: 2}, Object {a: 1, b: 2}}</pre> + +<h3 id="Обход_Set">Обход Set</h3> + +<pre class="brush: js">// обход элементов set +// выведет элементы по порядку: 1, "some text", {"a": 1, "b": 2} +for (let item of mySet) console.log(item); + +// выведет элементы по порядку: 1, "some text", {"a": 1, "b": 2} +for (let item of mySet.keys()) console.log(item); + +// выведет элементы по порядку: 1, "some text", {"a": 1, "b": 2} +for (let item of mySet.values()) console.log(item); + +// выведет элементы по порядку: 1, "some text", {"a": 1, "b": 2} +//(key и value в данном случае одинаковы) +for (let [key, value] of mySet.entries()) console.log(key); + +// преобразует Set в Array +var myArr = Array.from(mySet); // [1, "some text", {"a": 1, "b": 2}] + +// следующее будет работать при запуске с HTML документом +mySet.add(document.body); +mySet.has(document.querySelector("body")); // true + +// преобразования из Array в Set и обратно +mySet2 = new Set([1,2,3,4]); +mySet2.size; // 4 +[...mySet2]; // [1,2,3,4] + +// пересечение можно представить следующим образом +var intersection = new Set([...set1].filter(x => set2.has(x))); + +// разность можно представить следующим образом +var difference = new Set([...set1].filter(x => !set2.has(x))); + +// Обход элементов set при помощи forEach +mySet.forEach(function(value) { + console.log(value); +}); + +// 1 +// 2 +// 3 +// 4 +</pre> + +<h3 id="Реализация_простых_операций">Реализация простых операций</h3> + +<pre class="brush: js"><code>function isSuperset(set, subset) { + for (var elem of subset) { + if (!set.has(elem)) { + return false; + } + } + return true; +} + +function union(setA, setB) { + var _union = new Set(setA); + for (var elem of setB) { + _union.add(elem); + } + return _union; +} + +function intersection(setA, setB) { + var _intersection = new Set(); + for (var elem of setB) { + if (setA.has(elem)) { + _intersection.add(elem); + } + } + return _intersection; +} + +function difference(setA, setB) { + var _difference = new Set(setA); + for (var elem of setB) { + _difference.delete(elem); + } + return _difference; +} + +// Например +var setA = new Set([1, 2, 3, 4]), + setB = new Set([2, 3]), + setC = new Set([3, 4, 5, 6]); + +isSuperset(setA, setB); // => true +union(setA, setC); // => Set [1, 2, 3, 4, 5, 6] +intersection(setA, setC); // => Set [3, 4] +difference(setA, setC); // => Set [1, 2]</code> +</pre> + +<h3 id="Взаимоотношения_с_объектом_Array">Взаимоотношения с объектом <code>Array</code></h3> + +<pre class="brush: js">var myArray = ["value1", "value2", "value3"]; + +// Используйте конструктор Set для преобразования Array в Set +var mySet = new Set(myArray); + +mySet.has("value1"); // вернёт true + +// Используйте spread оператор для преобразования Set в Array +console.log([...mySet]); // Отобразит тот же массив, что и myArray +</pre> + +<h3 id="Взаимоотношения_со_String">Взаимоотношения со <code>String</code></h3> + +<pre class="brush: js"><code>var text = 'India'; + +var mySet = new Set(text); // Set ['I', 'n', 'd', 'i', 'a'] +mySet.size; // 5</code> +</pre> + +<h2 id="Спецификации">Спецификации</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Спецификация</th> + <th scope="col">Статус</th> + <th scope="col">Комментарий</th> + </tr> + <tr> + <td>{{SpecName('ES6', '#sec-set-objects', 'Set')}}</td> + <td>{{Spec2('ES6')}}</td> + <td>Изначальное определение.</td> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-set-objects', 'Set')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td> </td> + </tr> + </tbody> +</table> + +<h2 id="Совместимость_с_браузерами">Совместимость с браузерами</h2> + +<p>{{Compat("javascript.builtins.Set")}}</p> + +<h2 id="Смотрите_также">Смотрите также</h2> + +<ul> + <li>{{jsxref("Map")}}</li> + <li>{{jsxref("WeakMap")}}</li> + <li>{{jsxref("WeakSet")}}</li> +</ul> |