Baseline Widely available
СводкаÐпеÑаÑÐ¾Ñ for...of
вÑполнÑÐµÑ Ñикл обÑ
ода иÑеÑиÑÑемÑÑ
обÑекÑов (вклÑÑÐ°Ñ Array
, Map
, Set
, обÑÐµÐºÑ Ð°ÑгÑменÑов и подобнÑÑ
), вÑзÑÐ²Ð°Ñ Ð½Ð° каждом Ñаге иÑеÑаÑии опеÑаÑоÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ Ð¸Ð· ÑазлиÑнÑÑ
ÑвойÑÑв обÑекÑа.
for (variable of iterable) { statement }
variable
Ðа каждом Ñаге иÑеÑаÑии variable
пÑиÑваиваеÑÑÑ Ð·Ð½Ð°Ñение нового ÑвойÑÑва обÑекÑа iterable
. ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ variable
Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñакже обÑÑвлена Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ const
, let
или var
.
iterable
ÐбÑекÑ, пеÑеÑиÑлÑемÑе ÑвойÑÑва коÑоÑого Ð¾Ð±Ñ Ð¾Ð´ÑÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñикла.
Array
let iterable = [10, 20, 30]; for (let value of iterable) { value += 1; console.log(value); } // 11 // 21 // 31
Ðожно Ñакже иÑполÑзоваÑÑ const
вмеÑÑо let
, еÑли не нÑжно пеÑеназнаÑаÑÑ Ð¿ÐµÑеменнÑе внÑÑÑи блока.
let iterable = [10, 20, 30]; for (const value of iterable) { console.log(value); } // 10 // 20 // 30ÐÐ±Ñ Ð¾Ð´
String
let iterable = 'boo'; for (let value of iterable) { console.log(value); } // "b" // "o" // "o"ÐÐ±Ñ Ð¾Ð´
TypedArray
let iterable = new Uint8Array([0x00, 0xff]); for (let value of iterable) { console.log(value); } // 0 // 255ÐÐ±Ñ Ð¾Ð´
Map
let iterable = new Map([['a', 1], ['b', 2], ['c', 3]]); for (let entry of iterable) { console.log(entry); } // ['a', 1] // ['b', 2] // ['c', 3] for (let [key, value] of iterable) { console.log(value); } // 1 // 2 // 3ÐÐ±Ñ Ð¾Ð´
Set
let iterable = new Set([1, 1, 2, 2, 3, 3]); for (let value of iterable) { console.log(value); } // 1 // 2 // 3ÐÐ±Ñ Ð¾Ð´ обÑекÑа
arguments
(function() { for (let argument of arguments) { console.log(argument); } })(1, 2, 3); // 1 // 2 // 3ÐÐ±Ñ Ð¾Ð´ DOM коллекÑий
ÐбÑ
од DOM коллекÑий наподобие NodeList
: ÑледÑÑÑий пÑÐ¸Ð¼ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÐµÑ ÐºÐ»Ð°ÑÑ read
паÑагÑаÑам, ÑвлÑÑÑимÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвеннÑми поÑомками ÑÑаÑей:
// ÐÑимеÑание: ÑабоÑÐ°ÐµÑ ÑолÑко на плаÑÑоÑÐ¼Ð°Ñ , где // Ñеализован NodeList.prototype[Symbol.iterator] let articleParagraphs = document.querySelectorAll('article > p'); for (let paragraph of articleParagraphs) { paragraph.classList.add('read'); }ÐакÑÑÑие иÑеÑаÑоÑов
Ð ÑиклаÑ
for...of
аваÑийнÑй вÑÑ
од оÑÑÑеÑÑвлÑеÑÑÑ ÑеÑез break
, throw
или return
. Ðо вÑеÑ
ваÑианÑаÑ
иÑеÑаÑÐ¾Ñ Ð·Ð°Ð²ÐµÑÑаеÑÑÑ.
function* foo(){ yield 1; yield 2; yield 3; }; for (let o of foo()) { console.log(o); break; // иÑеÑаÑÐ¾Ñ Ð·Ð°ÐºÑÑваеÑÑÑ, возвÑÐ°Ñ }ÐÐ±Ñ Ð¾Ð´ генеÑаÑоÑов
ÐÑ Ð¼Ð¾Ð¶ÐµÑе вÑполнÑÑÑ Ð¾Ð±Ñ Ð¾Ð´ генеÑаÑоÑов, Ð²Ð¾Ñ Ð¿ÑимеÑ:
function* fibonacci() {
// ÑÑнкÑиÑ-генеÑаÑоÑ
let [prev, curr] = [0, 1];
for (;;) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
for (let n of fibonacci()) {
// огÑаниÑÐ¸Ð²Ð°ÐµÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Ð½Ð° 1000
if (n > 1000) break;
console.log(n);
}
Ðе пÑÑайÑеÑÑ Ð¿Ð¾Ð²ÑоÑно иÑполÑзоваÑÑ Ð³ÐµÐ½ÐµÑаÑоÑ
ÐенеÑаÑоÑÑ Ð½ÐµÐ»ÑÐ·Ñ Ð¸ÑполÑзоваÑÑ Ð´Ð²Ð°Ð¶Ð´Ñ, даже еÑли Ñикл for...of
завеÑÑиÑÑÑ Ð°Ð²Ð°Ñийно, напÑимеÑ, ÑеÑез опеÑаÑÐ¾Ñ break
. ÐÑи вÑÑ
оде из Ñикла генеÑаÑÐ¾Ñ Ð·Ð°Ð²ÐµÑÑаеÑÑÑ, и лÑбÑе попÑÑки полÑÑиÑÑ Ð¸Ð· него знаÑение обÑеÑенÑ.
var 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); // Ðе бÑÐ´ÐµÑ Ð²Ñзван
}
ÐбÑ
од иÑеÑиÑÑемÑÑ
обÑекÑов
ÐÑоме Ñого, можно ÑделаÑÑ Ð¾Ð±Ñ Ð¾Ð´ обÑекÑа, Ñвно ÑеализÑÑÑего iterable:
var iterable = { [Symbol.iterator]() { return { i: 0, next() { if (this.i < 3) { return { value: this.i++, done: false }; } return { value: undefined, done: true }; } }; } }; for (var value of iterable) { console.log(value); } // 0 // 1 // 2РазлиÑÐ¸Ñ Ð¼ÐµÐ¶Ð´Ñ
for...of
и for...in
Ðба опеÑаÑоÑа, и for...in
и for...of
пÑоизводÑÑ Ð¾Ð±Ñ
од обÑекÑов . РазниÑа в Ñом, как они ÑÑо делаÑÑ.
ÐÐ»Ñ for...in
обÑ
од пеÑеÑиÑлÑемÑÑ
ÑвойÑÑв обÑекÑа оÑÑÑеÑÑвлÑеÑÑÑ Ð² пÑоизволÑном поÑÑдке.
ÐÐ»Ñ for...of
обÑ
од пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð² ÑооÑвеÑÑÑвии Ñ Ñем, какой поÑÑдок опÑеделÑн в иÑеÑиÑÑемом обÑекÑе.
СледÑÑÑий пÑÐ¸Ð¼ÐµÑ Ð¿Ð¾ÐºÐ°Ð·ÑÐ²Ð°ÐµÑ ÑазлиÑÐ¸Ñ Ð² ÑабоÑе Ñиклов for...of
и for...in
пÑи обÑ
оде Array
.
Object.prototype.objCustom = function() {}; Array.prototype.arrCustom = function() {}; let iterable = [3, 5, 7]; iterable.foo = 'hello'; 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 }
РазбеÑÑмÑÑ Ñаг за Ñагом в вÑÑеопиÑанном коде.
Object.prototype.objCustom = function() {}; Array.prototype.arrCustom = function() {}; let iterable = [3, 5, 7]; iterable.foo = 'hello';
ÐаждÑй обÑÐµÐºÑ ÑнаÑледÑÐµÑ Ð¼ÐµÑод objCustom
и каждÑй маÑÑив Array
ÑнаÑледÑÐµÑ Ð¼ÐµÑод arrCustom
благодаÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ñ
в Object.prototype
и Array.prototype
. ÐбÑÐµÐºÑ iterable
ÑнаÑледÑÐµÑ Ð¼ÐµÑÐ¾Ð´Ñ objCustom
и arrCustom
из-за наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ ÑеÑез пÑоÑоÑип.
for (let i in iterable) { console.log(i); // вÑÐ²ÐµÐ´ÐµÑ 0, 1, 2, "foo", "arrCustom", "objCustom" }
Цикл вÑÐ²Ð¾Ð´Ð¸Ñ ÑолÑко пеÑеÑиÑлÑемÑе ÑвойÑÑва обÑекÑа iterable
, в поÑÑдке иÑ
ÑозданиÑ. Ðн не вÑÐ²Ð¾Ð´Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ 3
, 5
, 7
и hello
поÑколÑÐºÑ Ð¾Ð½Ð¸ не ÑвлÑÑÑÑÑ Ð¿ÐµÑеÑиÑлÑемÑми, ÑакÑиÑеÑки они вообÑе не ÑвлÑÑÑÑÑ ÑвойÑÑвами, они ÑвлÑÑÑÑÑ Ð·Ð½Ð°ÑениÑми. ÐÑводÑÑÑÑ Ð¶Ðµ имена ÑвойÑÑв и меÑодов, напÑÐ¸Ð¼ÐµÑ arrCustom
и objCustom
. ÐÑли Ð²Ñ ÐµÑÑ Ð½Ðµ ÑовÑем понÑли, по каким ÑвойÑÑвам оÑÑÑеÑÑвлÑеÑÑÑ Ð¾Ð±Ñ
од, Ð²Ð¾Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑное обÑÑÑнение Ñого, как ÑабоÑÐ°ÐµÑ array iteration and for...in
.
for (let i in iterable) { if (iterable.hasOwnProperty(i)) { console.log(i); // вÑÐ²ÐµÐ´ÐµÑ 0, 1, 2, "foo" } }
Цикл аналогиÑен пÑедÑдÑÑемÑ, но иÑполÑзÑÐµÑ hasOwnProperty()
Ð´Ð»Ñ Ð¿ÑовеÑки Ñого, ÑобÑÑвенное ли ÑÑо ÑвойÑÑво обÑекÑа или ÑнаÑледованное. ÐÑводÑÑÑÑ ÑолÑко ÑобÑÑвеннÑе ÑвойÑÑва. Ðмена 0
, 1
, 2
и foo
пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñ ÑолÑко ÑкземплÑÑÑ Ð¾Ð±ÑекÑа (не ÑнаÑледованÑ). ÐеÑÐ¾Ð´Ñ arrCustom
и objCustom
не вÑводÑÑÑÑ, поÑколÑÐºÑ Ð¾Ð½Ð¸ ÑнаÑледованÑ.
for (let i of iterable) { console.log(i); // вÑÐ²ÐµÐ´ÐµÑ 3, 5, 7 }
ÐÑÐ¾Ñ Ñикл обÑ
Ð¾Ð´Ð¸Ñ iterable
и вÑÐ²Ð¾Ð´Ð¸Ñ Ñе знаÑÐµÐ½Ð¸Ñ Ð¸ÑеÑиÑÑемого обÑекÑа, коÑоÑÑе опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² ÑпоÑобе его пеÑебоÑа, Ñ.е. не ÑвойÑÑва обÑекÑа, а знаÑÐµÐ½Ð¸Ñ Ð¼Ð°ÑÑива 3
, 5
, 7
.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4