ایک object ہے جس میں method ہے جو کو واپس کرتا ہے۔ ایک object ہے اگر اس میں method ہو — یہی وہ چیز ہے جو اور spread کو کام کرتا ہے۔ () iterators بنانے کا ایک سہل طریقہ ہے جو کے ساتھ ہو سکتا ہے۔
ایک object ہے جس میں method ہے جو کو واپس کرتا ہے۔ ایک object ہے اگر اس میں method ہو — یہی وہ چیز ہے جو اور spread کو کام کرتا ہے۔ () iterators بنانے کا ایک سہل طریقہ ہے جو کے ساتھ ہو سکتا ہے۔
next(){ value, done }[Symbol.iterator]for...offunction*yieldfunction* idGenerator() {
let id = 1;
while (true) { // infinite, but lazy — only computes on demand
yield id++; // pause here, return a value, resume on next()
}
}
const gen = idGenerator();
gen.next().value; // 1
gen.next().value; // 2 — execution resumed where it paused
بنیادی نظریہ: ہر yield پر execution رکتی ہے اور اگلی .next() پر دوبارہ شروع ہوتی ہے، calls کے درمیان مقامی state محفوظ رہتی ہے۔ جب تک آپ اس کے لیے نہ پوچھیں کچھ بھی calculate نہیں ہوتا۔
// process a huge/infinite sequence without building it all in memory
function* take(iterable, n) {
let i = 0;
for (const x of iterable) {
if (i++ >= n) return;
yield x;
}
}
[...take(idGenerator(), 3)]; // [1, 2, 3] — from an infinite generator
const range = {
from: 1, to: 3,
*[Symbol.iterator]() { for (let i = this.from; i <= this.to; i++) yield i; },
};
[...range]; // [1, 2, 3] — works with for...of and spread
Generators سست/لامحدود sequences، custom iteration، اور memory-efficient streaming کو فعال کرتے ہیں۔
یہ ابتدائی async libraries (co) کی بنیاد بھی تھے اور async iteration (for await...of) کو support کرتے ہیں۔
Iterator protocol وہ چیز ہے جو for...of، spread، اور destructuring کو arrays، Maps، Sets، اور strings میں یکجا کرتی ہے۔