aboutsummaryrefslogtreecommitdiff
path: root/files/uk/web/javascript/reference/statements/for...of/index.html
diff options
context:
space:
mode:
authorPeter Bengtsson <mail@peterbe.com>2020-12-08 14:43:23 -0500
committerPeter Bengtsson <mail@peterbe.com>2020-12-08 14:43:23 -0500
commit218934fa2ed1c702a6d3923d2aa2cc6b43c48684 (patch)
treea9ef8ac1e1b8fe4207b6d64d3841bfb8990b6fd0 /files/uk/web/javascript/reference/statements/for...of/index.html
parent074785cea106179cb3305637055ab0a009ca74f2 (diff)
downloadtranslated-content-218934fa2ed1c702a6d3923d2aa2cc6b43c48684.tar.gz
translated-content-218934fa2ed1c702a6d3923d2aa2cc6b43c48684.tar.bz2
translated-content-218934fa2ed1c702a6d3923d2aa2cc6b43c48684.zip
initial commit
Diffstat (limited to 'files/uk/web/javascript/reference/statements/for...of/index.html')
-rw-r--r--files/uk/web/javascript/reference/statements/for...of/index.html319
1 files changed, 319 insertions, 0 deletions
diff --git a/files/uk/web/javascript/reference/statements/for...of/index.html b/files/uk/web/javascript/reference/statements/for...of/index.html
new file mode 100644
index 0000000000..dc4ebaf7b8
--- /dev/null
+++ b/files/uk/web/javascript/reference/statements/for...of/index.html
@@ -0,0 +1,319 @@
+---
+title: for...of
+slug: Web/JavaScript/Reference/Statements/for...of
+tags:
+ - ECMAScript 2015
+ - ES6
+ - JavaScript
+ - Довідка
+translation_of: Web/JavaScript/Reference/Statements/for...of
+---
+<div>{{jsSidebar("Statements")}}</div>
+
+<p>Конструкція <strong><code>for...of</code> </strong>створює цикл, що перебирає <a href="/uk/docs/Web/JavaScript/Reference/Протоколи_перебору#The_iterable_protocol">ітерабельні об'єкти</a>, в тому числі: вбудовані {{jsxref("String")}}, {{jsxref("Array")}}, подібні до масиву об'єкти (наприклад, {{jsxref("Functions/arguments", "arguments")}} або {{domxref("NodeList")}}), {{jsxref("TypedArray")}}, {{jsxref("Map")}}, {{jsxref("Set")}}, а також визначені користувачем ітерабельні об'єкти. Він викликає користувацький хук до ітерацій з командами, що виконуються для значення кожної окремої властивості об'єкта.</p>
+
+<div>{{EmbedInteractiveExample("pages/js/statement-forof.html")}}</div>
+
+
+
+<h2 id="Синтаксис">Синтаксис</h2>
+
+<pre class="syntaxbox">for (<em>variable</em> of <em>iterable</em>) {
+ <em>statement
+</em>}
+</pre>
+
+<dl>
+ <dt><code>variable</code></dt>
+ <dd>На кожній ітерації параметру <em>variable </em>призначається значення іншої властивості. Параметр <em>variable</em> може бути оголошений через <code>const</code>, <code>let</code> або <code>var</code>.</dd>
+ <dt><code>iterable</code></dt>
+ <dd>Об'єкт, чиї ітерабельні властивості перебираються.</dd>
+</dl>
+
+<h2 id="Приклади">Приклади</h2>
+
+<h3 id="Перебір_об'єкта_jsxref(Array)">Перебір об'єкта {{jsxref("Array")}}</h3>
+
+<pre class="brush:js">let iterable = [10, 20, 30];
+
+for (let value of iterable) {
+ value += 1;
+ console.log(value);
+}
+// 11
+// 21
+// 31
+</pre>
+
+<p>Ви також можете використати <a href="/uk/docs/Web/JavaScript/Reference/Statements/const"><code>const</code></a> замість <a href="/uk/docs/Web/JavaScript/Reference/Statements/let"><code>let</code></a>, якщо не переприсвоюєте змінну всередині блоку.</p>
+
+<pre class="brush:js">let iterable = [10, 20, 30];
+
+for (const value of iterable) {
+ console.log(value);
+}
+// 10
+// 20
+// 30
+</pre>
+
+<h3 id="Перебір_об'єкта_jsxref(String)">Перебір об'єкта {{jsxref("String")}}</h3>
+
+<pre class="brush:js">let iterable = 'фух';
+
+for (let value of iterable) {
+ console.log(value);
+}
+// "ф"
+// "у"
+// "х"
+</pre>
+
+<h3 id="Перебір_об'єкта_jsxref(TypedArray)">Перебір об'єкта {{jsxref("TypedArray")}}</h3>
+
+<pre class="brush:js">let iterable = new Uint8Array([0x00, 0xff]);
+
+for (let value of iterable) {
+ console.log(value);
+}
+// 0
+// 255
+</pre>
+
+<h3 id="Перебір_об'єкта_jsxref(Map)">Перебір об'єкта {{jsxref("Map")}}</h3>
+
+<pre class="brush:js">let iterable = new Map([['а', 1], ['б', 2], ['в', 3]]);
+
+for (let entry of iterable) {
+ console.log(entry);
+}
+// ['а', 1]
+// ['б', 2]
+// ['в', 3]
+
+for (let [key, value] of iterable) {
+ console.log(value);
+}
+// 1
+// 2
+// 3
+</pre>
+
+<h3 id="Перебір_об'єкта_jsxref(Set)">Перебір об'єкта {{jsxref("Set")}}</h3>
+
+<pre class="brush:js">let iterable = new Set([1, 1, 2, 2, 3, 3]);
+
+for (let value of iterable) {
+ console.log(value);
+}
+// 1
+// 2
+// 3
+</pre>
+
+<h3 id="Перебір_об'єкта_arguments">Перебір об'єкта arguments</h3>
+
+<p>Ви можете перебирати об'єкт {{jsxref("Functions/arguments", "arguments")}}, щоб дослідити усі параметри, передані у функцію JavaScript:</p>
+
+<pre class="brush: js">(function() {
+ for (let argument of arguments) {
+ console.log(argument);
+ }
+})(1, 2, 3);
+
+// 1
+// 2
+// 3</pre>
+
+<h3 id="Перебір_колекції_DOM-елементів">Перебір колекції DOM-елементів</h3>
+
+<p>Перебір колекцій DOM-елементів, таких як {{domxref("NodeList")}}: наступний приклад додає клас <code>read</code> до вузлів paragraph, які є прямими нащадками вузла article:</p>
+
+<pre class="brush:js">// Заувага: Це працюватиме лише у платформах, де
+// реалізовано NodeList.prototype[Symbol.iterator]
+let articleParagraphs = document.querySelectorAll('article &gt; p');
+
+for (let paragraph of articleParagraphs) {
+ paragraph.classList.add('read');
+}
+</pre>
+
+<h3 id="Закриття_ітераторів">Закриття ітераторів</h3>
+
+<p>У циклах <code>for...of</code> раптове переривання ітерації може бути спричинено операторами <code>break</code>, <code>throw</code> або <code>return</code>. У цих випадках ітератор закривається.</p>
+
+<pre class="brush: js">function* foo(){
+ yield 1;
+ yield 2;
+ yield 3;
+};
+
+for (let o of foo()) {
+ console.log(o);
+ break; // закриває ітератор, виконання продовжується поза циклом
+}
+console.log('done');
+</pre>
+
+<h3 id="Перебір_генераторів">Перебір генераторів</h3>
+
+<p>Ви також можете перебирати <a href="/uk/docs/Web/JavaScript/Reference/Statements/function*">генератори</a>, тобто, функції, що генерують ітерабельні об'єкти:</p>
+
+<pre class="brush:js">function* fibonacci() { // функція-генератор
+ let [prev, curr] = [0, 1];
+ while (true) {
+ [prev, curr] = [curr, prev + curr];
+ yield curr;
+ }
+}
+
+for (let n of fibonacci()) {
+ console.log(n);
+ // обрізати послідовність на 1000
+ if (n &gt;= 1000) {
+ break;
+ }
+}
+</pre>
+
+<h4 id="Не_використовуйте_генератори_повторно">Не використовуйте генератори повторно</h4>
+
+<p>Генератори не можна використовувати повторно, навіть якщо цикл <code>for...of</code> завчасно перервався, наприклад, ключовим словом {{jsxref("Statements/break", "break")}}. На виході з циклу генератор закривається, і спроби викликати його знову не дадуть подальших результатів.</p>
+
+<pre class="brush: js example-bad">let gen = (function *(){
+ yield 1;
+ yield 2;
+ yield 3;
+})();
+for (let o of gen) {
+ console.log(o);
+ break; // закриває ітератор
+}
+
+// Генератор не можна використовувати знову, наступне не має сенсу!
+for (let o of gen) {
+ console.log(o); // Ніколи не виконається.
+}
+</pre>
+
+<h3 id="Перебір_інших_ітерабельних_об'єктів">Перебір інших ітерабельних об'єктів</h3>
+
+<p>Ви також можете перебирати об'єкт, який відкрито реалізує протокол <a href="/uk/docs/Web/JavaScript/Reference/Iteration_protocols#iterable">ітерабельного</a>:</p>
+
+<pre class="brush:js">let iterable = {
+ [Symbol.iterator]() {
+ return {
+ i: 0,
+ next() {
+ if (this.i &lt; 3) {
+ return { value: this.i++, done: false };
+ }
+ return { value: undefined, done: true };
+ }
+ };
+ }
+};
+
+for (let value of iterable) {
+ console.log(value);
+}
+// 0
+// 1
+// 2
+</pre>
+
+<h3 id="Різниця_між_for...of_та_for...in">Різниця між <code>for...of</code> та <code>for...in</code></h3>
+
+<p>І цикл <code>for...in</code>, і цикл <code>for...of</code> щось перебирають. Головна різниця між ними полягає в тому, що саме вони перебирають.</p>
+
+<p>Цикл {{jsxref("Statements/for...in", "for...in")}} перебирає <a href="/uk/docs/Web/JavaScript/Перелічуваність_та_належність_властивостей">перелічувані властивості</a> об'єкта, у довільному порядку.</p>
+
+<p>Цикл <code>for...of</code> перебирає значення, які <a href="/uk/docs/Web/JavaScript/Guide/Iterators_and_Generators#Iterables">ітерабельний об'єкт</a> визначає для перебирання.</p>
+
+<p>Наступний приклад демонструє різницю між циклом <code>for...of</code> та циклом <code>for...in</code> при використанні з {{jsxref("Array", "масивом")}}.</p>
+
+<pre class="brush:js">Object.prototype.objCustom = function() {};
+Array.prototype.arrCustom = function() {};
+
+let iterable = [3, 5, 7];
+iterable.foo = 'привіт';
+
+for (let i in iterable) {
+ console.log(i); // виведе 0, 1, 2, "foo", "arrCustom", "objCustom"
+}
+
+for (let i in iterable) {
+  if (iterable.hasOwnProperty(i)) {
+    console.log(i); // виведе 0, 1, 2, "foo"
+  }
+}
+
+for (let i of iterable) {
+ console.log(i); // виведе 3, 5, 7
+}
+</pre>
+
+<p>Розглянемо наведений код крок за кроком.</p>
+
+<pre class="brush: js">Object.prototype.objCustom = function() {};
+Array.prototype.arrCustom = function() {};
+
+let iterable = [3, 5, 7];
+iterable.foo = 'привіт';</pre>
+
+<p>Кожний об'єкт успадковуватиме властивість <code>objCustom</code> і кожний об'єкт, що є об'єктом {{jsxref("Array")}}, успадковуватиме властивість <code>arrCustom</code>, оскільки ці властивості були додані у {{jsxref("Object.prototype")}} та {{jsxref("Array.prototype")}} відповідно. Об'єкт <code>iterable</code> успадковує властивості <code>objCustom</code> та <code>arrCustom</code> через <a href="/uk/docs/Web/JavaScript/Inheritance_and_the_prototype_chain">наслідування та ланцюжок прототипів</a>.</p>
+
+<pre class="brush: js">for (let i in iterable) {
+ console.log(i); // виведе 0, 1, 2, "foo", "arrCustom", "objCustom"
+}</pre>
+
+<p>Цей цикл виводить тільки <a href="/uk/docs/Web/JavaScript/Перелічуваність_та_належність_властивостей">перелічувані властивості</a> об'єкта <code>iterable</code>, у довільному порядку. Він не виводить <strong>елементи</strong> масиву <code>3</code>, <code>5</code>, <code>7</code> або <code>привіт</code>, оскільки вони <strong>не</strong> є перелічуваними властивостями, власне, вони взагалі не є властивостями, вони є <strong>значеннями</strong>. Цикл виводить <strong>індекси</strong> масиву, а також <code>arrCustom</code> та <code>objCustom</code>, які є властивостями. Якщо ви не певні, чому ці властивості перебираються, є більш детальне пояснення того, як працює {{jsxref("Statements/for...in", "перебір масиву та for...in", "#Перебір_масиву_та_for...in")}}.</p>
+
+<pre class="brush: js">for (let i in iterable) {
+ if (iterable.hasOwnProperty(i)) {
+ console.log(i); // виведе 0, 1, 2, "foo"
+  }
+}</pre>
+
+<p>Цей цикл схожий на перший, але використовує {{jsxref("Object.prototype.hasOwnProperty()", "hasOwnProperty()")}} для перевірки, чи є знайдена перелічувана властивість особистою властивістю об'єкта, тобто, не успадкованою. Якщо є, властивість виводиться. Властивості <code>0</code>, <code>1</code>, <code>2</code> та <code>foo</code> виводяться, оскільки вони є особистими властивостями (<strong>не успадкованими</strong>). Властивості <code>arrCustom</code> та <code>objCustom</code> не виводяться, оскільки вони <strong>успадковані</strong>.</p>
+
+<pre class="brush: js">for (let i of iterable) {
+ console.log(i); // виведе 3, 5, 7
+}</pre>
+
+<p>Цей цикл перебирає та виводить <strong>значення</strong>, які <code>iterable</code> як <a href="/uk/docs/Web/JavaScript/Guide/Iterators_and_Generators#Iterables">ітерабельний об'єкт</a><strong> </strong>визначає для перебору. <strong>Елементи</strong> об'єкта <code>3</code>, <code>5</code>, <code>7</code> виводяться, але немає жодної з <strong>властивостей</strong> об'єкта.</p>
+
+<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('ES2015', '#sec-for-in-and-for-of-statements', 'for...of statement')}}</td>
+ <td>{{Spec2('ES2015')}}</td>
+ <td>Початкове визначення.</td>
+ </tr>
+ <tr>
+ <td>{{SpecName('ESDraft', '#sec-for-in-and-for-of-statements', 'for...of statement')}}</td>
+ <td>{{Spec2('ESDraft')}}</td>
+ <td></td>
+ </tr>
+ </tbody>
+</table>
+
+<h2 id="Сумісність_з_веб-переглядачами">Сумісність з веб-переглядачами</h2>
+
+
+
+<p>{{Compat("javascript.statements.for_of")}}</p>
+
+<h2 id="Див._також">Див. також</h2>
+
+<ul>
+ <li>{{jsxref("Array.prototype.forEach()")}}</li>
+ <li>{{jsxref("Map.prototype.forEach()")}}</li>
+</ul>