for...of
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since иÑÐ»Ñ 2015 г..
Сводка
ÐпеÑаÑÐ¾Ñ 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 .
СпеÑиÑикаÑии
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-for-in-and-for-of-statements> |