اشياء قابل تكرار، اشيائي هستند كه ميتوان آنهارا باfor.. in حلقه زد .
از نظر فني تكرار پذيرها بايد متدSymbol.iterator را پياده سازي كنند .
ميتوان با استفاده از حلقه for..of روي عناصر رشته دور زد .
مثال ـ دور زدن روي رشته
for (const x of "W3Schools") { // code block to be executed }
ميتوان از حلقهfor .. of براي تكرار روي عناصر يك آرايه استفاده كرد
مثال ـ تكرار روي عناصر آرايه
for (const x of [1,2,3,4,5]) { // code block to be executed }
پروتكل تكرار كننده(iterator protocol ) نحوي توليد دنباله اي از مقادير يك شئ را تعريف ميكند.
يك شئ با پياده سازي متدnext() تبديل بيك تكرار شونده ميگردد .
متدnext() بايد يك شئ را با دو ويژگي برگشت دهد :
در جدول زير شرح دو آيتم برگشتي آمده است.
value | مقدار برگشتي بوسيله تكراركننده اگر تكرار كامل نباشد |
done | اگر عمل تكرار كننده كامل باشدtrue در غير اينصورت false برگشت ميشود . |
مثال ـ در اين تكراركننده هر گز پايان تكرار برگشت نمي شود . مقادير10,20,30,.. bdi>
// Home Made Iterable function myNumbers() { let n = 0; return { next: function() { n += 10; return {value:n, done:false}; } }; } // Create Iterable const n = myNumbers(); n.next(); // Returns 10 n.next(); // Returns 20 n.next(); // Returns 30
مشكلي كه در تكرار پذير خانگي است ، در جاوااسكريپت براي حلقه زدن با for ..of پشتيباني نمي شود.
تكرار پذير جاواسكريپت شئ است كه دارايSymbol.iterator باشد .
Symbol.iteratorتابعي است كه يك تابع next() رابرگشت ميدهد.
يك تكرار پذير ميتوا ند روي كدfor (const x of iterable) { } در دور قرار بگيرد.
مثال ـ تكرار پذير جاوااسكريپت
// Create an Object myNumbers = {}; // Make it Iterable myNumbers[Symbol.iterator] = function() { let n = 0; done = false; return { next() { n += 10; if (n == 100) {done = true} return {value:n, done:done}; } };
اكنون ميتوان آنرا باfor .. of استفاده كرد .
for (const num of myNumbers) { // Any Code Here }
متدSymbol.iterator بطور خودكار توسطfor .. of فراخوان ميشود .اما ميتوان همچنين آنرا غير خودكار يا دستي انجام داد.
مثال ـ فراخوان غير خودكارSymbol.iterator
let iterator = myNumbers[Symbol.iterator]();
while (true) {
const result = iterator.next();
if (result.done) break;
// Any Code Here
}