An हा पद्धतीसह एक ऑब्जेक्ट असतो जो परत करतो। एक ऑब्जेक्ट आहे जर त्याला पद्धत आहे — हेच आणि spread काम करते असे बनवते। A () हा iterators तयार करण्याचा सुविधाजनक मार्ग आहे जो सह ।
An हा पद्धतीसह एक ऑब्जेक्ट असतो जो परत करतो। एक ऑब्जेक्ट आहे जर त्याला पद्धत आहे — हेच आणि spread काम करते असे बनवते। A () हा 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 वर कार्यान्वयन थांबतो आणि पुढील .next() वर पुन्हा सुरू होतो, कॉलमध्ये स्थानिक स्थिती जतन करते। कोणतेही गणना करायला लागत नाही जोपर्यंत आप त्याला मागू शकत नाहीत।
// 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 आळस/अनंत अनुक्रम, कस्टम पुनरावृत्ती आणि स्मृती-कुशल स्ट्रीमिंग सक्षम करतात।
ते लवकरच async लायब्ररीज (co) चे आधार होते आणि async पुनरावृत्ति (for await...of) अधोरेखित करते।
Iterator प्रोटोकॉल हे आहे जो arrays, Maps, Sets आणि strings मध्ये for...of, spread आणि destructuring एकीकृत करते।