قابل تکرارها (Iterables)
«قابل تکرار (Iterable)» یعنی شیئی که می شود با حلقه چرخید. مثل صف بچه ها که یکی یکی رد می شوند. با for...of روی عناصرش می گردیم.
حلقه for...of روی قابل تکرارها
با for...of روی عناصر «Iterable» می چرخیم و هر بار یک مقدار می گیریم.
for (const value of iterable) {
// کد برای هر مقدار
}
تکرار روی رشته (String)
هر حرف یک عنصر است. پس حلقه روی حروف می چرخد.
const name = "W3Schools";
for (const ch of name) {
// کار با هر حرف
}
تکرار روی آرایه (Array)
هر عنصر آرایه را می گیریم. ترتیب حفظ می شود.
const letters = ["a", "b", "c"];
for (const x of letters) {
// کار با هر عنصر
}
const numbers = [2, 4, 6, 8];
for (const n of numbers) {
// کار با هر عدد
}
تکرار روی Set
Set عنصر تکراری ندارد. با for...of می چرخیم.
const letters = new Set(["a", "b", "c"]);
for (const x of letters) {
// کار با هر عضو یکتا
}
تکرار روی Map
Map جفت «کلید، مقدار» نگه می دارد. حلقه هر جفت را می دهد.
const fruits = new Map([
["apples", 500],
["bananas", 300],
["oranges", 200]
]);
for (const entry of fruits) {
// entry یک [key, value] است
}
پروتکل Iterator و متد next()
«تکرارگر (Iterator)» شیئی است با متد next(). هر بار یک شی برمی گرداند: { value, done }.
function myNumbers() {
let n = 0;
return {
next: function() {
n += 10;
return { value: n, done: false };
}
};
}
const it = myNumbers();
it.next();
it.next();
it.next();
نکته: این نمونه ساده برای for...of مناسب نیست.
قابل تکرار کردن شیء با Symbol.iterator
اگر Symbol.iterator برگرداننده یک Iterator باشد، شیء «قابل تکرار» می شود.
let myNumbers = {};
myNumbers[Symbol.iterator] = function() {
let n = 0;
let done = false;
return {
next() {
n += 10;
if (n == 100) {
done = true;
}
return { value: n, done: done };
}
};
};
for (const num of myNumbers) {
// استفاده از num
}
اجرای دستی Iterator
می توانیم بجای for...of، خودمان next() را صدا بزنیم.
let iterator = myNumbers[Symbol.iterator]();
while (true) {
const result = iterator.next();
if (result.done) {
break;
}
// کار با result.value
}
تمرین های کوتاه
- روی یک رشته با for...of بگرد.
- یک Set بساز و چاپش کن.
- یک شیء با Symbol.iterator بساز.
برای مرور حلقه ها به حلقه زنی برو. درباره «تکرارشونده ها» بیشتر در Iterators بخوان.
جمع بندی سریع
- for...of روی «قابل تکرار» می چرخد.
- Iterator متد next() دارد.
- next() شیء { value, done } می دهد.
- Symbol.iterator شیء را قابل تکرار می کند.