{"id":41770,"date":"2026-05-15T08:00:48","date_gmt":"2026-05-15T05:00:48","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=41770"},"modified":"2026-05-15T11:16:56","modified_gmt":"2026-05-15T08:16:56","slug":"javascriptte-iterables-ve-iteratorsa-giris","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/","title":{"rendered":"JavaScript&#8217;te Iterables ve Iterators&#8217;a Giri\u015f"},"content":{"rendered":"<h2>JavaScript&#8217;te Iterables ve Iterators&#8217;a Giri\u015f<\/h2>\n<p>JavaScript, dinamik ve esnek bir programlama dili olarak, verilerle \u00e7al\u0131\u015fmak i\u00e7in \u00e7e\u015fitli yap\u0131lar sunar. Diziler, dizeler, haritalar ve k\u00fcmeler gibi koleksiyonlar, g\u00fcnl\u00fck geli\u015ftirme s\u00fcre\u00e7lerimizin ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r. Bu koleksiyonlar \u00fczerinde gezinme, elemanlar\u0131na eri\u015fme ve i\u015fleme yetene\u011fi, her programlama dilinin temel bir \u00f6zelli\u011fidir. Tarihsel olarak, JavaScript&#8217;te bu t\u00fcr i\u015flemler i\u00e7in <code>for<\/code> d\u00f6ng\u00fcs\u00fc, <code>for...in<\/code> d\u00f6ng\u00fcs\u00fc ve diziler i\u00e7in <code>forEach<\/code> gibi y\u00f6ntemler kullan\u0131lm\u0131\u015ft\u0131r. Ancak, farkl\u0131 veri yap\u0131lar\u0131 i\u00e7in farkl\u0131 iterasyon mekanizmalar\u0131, bazen tutars\u0131zl\u0131k ve karma\u015f\u0131kl\u0131k yaratabilmekteydi. \u0130\u015fte bu noktada, ES6 (ECMAScript 2015) ile birlikte tan\u0131t\u0131lan Iterables (Yinelenebilirler) ve Iterators (Yineleyiciler) kavramlar\u0131 devreye girerek, JavaScript&#8217;te veri yap\u0131lar\u0131 \u00fczerinde gezinmek i\u00e7in standart, birle\u015fik ve g\u00fc\u00e7l\u00fc bir yakla\u015f\u0131m sunmu\u015ftur.<\/p>\n<p>Bu makale, Iterables ve Iterators&#8217;\u0131n ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, neden \u00f6nemli olduklar\u0131n\u0131 ve modern JavaScript uygulamalar\u0131nda nas\u0131l etkin bir \u015fekilde kullan\u0131labilece\u011fini derinlemesine inceleyecektir. <code>for...of<\/code> d\u00f6ng\u00fcs\u00fcn\u00fcn bu mekanizmalarla nas\u0131l entegre oldu\u011funu, kendi \u00f6zel iterable nesnelerimizi nas\u0131l olu\u015fturabilece\u011fimizi ve jenerat\u00f6r fonksiyonlar\u0131n\u0131n bu s\u00fcreci nas\u0131l basitle\u015ftirdi\u011fini ele alaca\u011f\u0131z. Ayr\u0131ca, asenkron iterasyonun g\u00fcc\u00fcn\u00fc ve <code>for await...of<\/code> d\u00f6ng\u00fcs\u00fcn\u00fcn sundu\u011fu imkanlar\u0131 da ke\u015ffedece\u011fiz. Bu kavramlar\u0131 anlamak, daha temiz, daha verimli ve daha esnek JavaScript kodu yazman\u0131n kap\u0131lar\u0131n\u0131 aralayacakt\u0131r.<\/p>\n<h3>Iterables Nedir?<\/h3>\n<p>Bir nesnenin &#8220;iterable&#8221; (yinelenebilir) olmas\u0131 demek, o nesnenin elemanlar\u0131 \u00fczerinde birer birer gezinebilen bir mekanizma sa\u011flamas\u0131 demektir. Teknik olarak, JavaScript&#8217;te bir nesnenin iterable say\u0131labilmesi i\u00e7in, <code>[Symbol.iterator]<\/code> ad\u0131nda bir metoda sahip olmas\u0131 gerekir. Bu \u00f6zel sembol metodu, \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda bir &#8220;iterator&#8221; (yineleyici) d\u00f6nd\u00fcrmekle y\u00fck\u00fcml\u00fcd\u00fcr. Iterable protokol\u00fc, JavaScript&#8217;teki bir\u00e7ok yerle\u015fik veri yap\u0131s\u0131n\u0131n (Diziler, Dizeler, Haritalar, K\u00fcmeler, <code>NodeList<\/code> ve <code>arguments<\/code> nesnesi gibi) <code>for...of<\/code> d\u00f6ng\u00fcs\u00fc ile do\u011frudan kullan\u0131labilmesini sa\u011flar.<\/p>\n<p><code>[Symbol.iterator]<\/code> metodu, bir nesnenin nas\u0131l yinelenece\u011fini tan\u0131mlayan bir fabrikat\u00f6r gibidir. Her \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, o nesnenin elemanlar\u0131 \u00fczerinde gezinebilecek yeni bir iterator nesnesi \u00fcretir. Bu sayede, ayn\u0131 iterable nesne \u00fczerinde birden fazla ba\u011f\u0131ms\u0131z iterasyon i\u015flemi ger\u00e7ekle\u015ftirebiliriz. \u00d6rne\u011fin, bir dizi \u00fczerinde bir d\u00f6ng\u00fc \u00e7al\u0131\u015f\u0131rken, ba\u015fka bir yerde ayn\u0131 dizi \u00fczerinde farkl\u0131 bir d\u00f6ng\u00fc ba\u015flatabiliriz ve bu d\u00f6ng\u00fcler birbirini etkilemez.<\/p>\n<p><strong>Yerle\u015fik Iterable \u00d6rnekleri:<\/strong><\/p>\n<p>*   <strong>Diziler (Arrays):<\/strong> En yayg\u0131n iterable t\u00fcr\u00fcd\u00fcr.<\/p>\n<pre><code class=\"language-javascript\">const myArray = [10, 20, 30];\r\n    for (const item of myArray) {\r\n      console.log(item); \/\/ 10, 20, 30\r\n    }<\/code><\/pre>\n<p>*   <strong>Dizeler (Strings):<\/strong> Her karakteri ayr\u0131 bir eleman olarak yinelenebilir.<\/p>\n<pre><code class=\"language-javascript\">const myString = &quot;Hello&quot;;\r\n    for (const char of myString) {\r\n      console.log(char); \/\/ H, e, l, l, o\r\n    }<\/code><\/pre>\n<p>*   <strong>Haritalar (Maps):<\/strong> Anahtar-de\u011fer \u00e7iftlerini <code>[anahtar, de\u011fer]<\/code> dizisi olarak yinelenebilir.<\/p>\n<pre><code class=\"language-javascript\">const myMap = new Map();\r\n    myMap.set('a', 1);\r\n    myMap.set('b', 2);\r\n    for (const entry of myMap) {\r\n      console.log(entry); \/\/ ['a', 1], ['b', 2]\r\n    }\r\n    \/\/ Veya do\u011frudan anahtarlar ve de\u011ferler \u00fczerinde:\r\n    for (const key of myMap.keys()) {\r\n      console.log(key); \/\/ a, b\r\n    }\r\n    for (const value of myMap.values()) {\r\n      console.log(value); \/\/ 1, 2\r\n    }<\/code><\/pre>\n<p>*   <strong>K\u00fcmeler (Sets):<\/strong> K\u00fcmelerdeki benzersiz de\u011ferleri yinelenebilir.<\/p>\n<pre><code class=\"language-javascript\">const mySet = new Set([1, 2, 3]);\r\n    for (const value of mySet) {\r\n      console.log(value); \/\/ 1, 2, 3\r\n    }<\/code><\/pre>\n<p>Bir nesnenin iterable olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in, o nesnenin <code>[Symbol.iterator]<\/code> metoduna sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol edebiliriz:<\/p>\n<pre><code class=\"language-javascript\">const isIterable = (obj) =&gt; obj != null &amp;&amp; typeof obj[Symbol.iterator] === 'function';\r\n\r\nconsole.log(isIterable([1, 2, 3]));     \/\/ true\r\nconsole.log(isIterable(&quot;hello&quot;));       \/\/ true\r\nconsole.log(isIterable(new Map()));     \/\/ true\r\nconsole.log(isIterable(new Set()));     \/\/ true\r\nconsole.log(isIterable({ a: 1, b: 2 })); \/\/ false (s\u0131radan obje iterable de\u011fildir)<\/code><\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, s\u0131radan obje literal&#8217;lar\u0131 varsay\u0131lan olarak iterable de\u011fildir. Ancak, daha sonra g\u00f6rece\u011fimiz gibi, onlar\u0131 da iterable hale getirebiliriz.<\/p>\n<h3>Iterators Nedir?<\/h3>\n<p>Bir &#8220;iterator&#8221; (yineleyici), bir iterable nesnenin elemanlar\u0131 \u00fczerinde ad\u0131m ad\u0131m gezinmek i\u00e7in kullan\u0131lan bir nesnedir. Iterator protokol\u00fc, bir nesnenin iterator olarak kabul edilmesi i\u00e7in, o nesnenin arg\u00fcman almayan bir <code>next()<\/code> metoduna sahip olmas\u0131n\u0131 gerektirir. <code>next()<\/code> metodu her \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, iterasyonun bir sonraki eleman\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr. Bu eleman, <code>{ value: any, done: boolean }<\/code> \u015feklinde bir obje olmal\u0131d\u0131r.<\/p>\n<p>*   <code>value<\/code>: \u0130terasyonun mevcut ad\u0131m\u0131ndaki de\u011feri temsil eder. \u0130terasyon tamamland\u0131\u011f\u0131nda (yani <code>done: true<\/code> oldu\u011funda) bu de\u011fer <code>undefined<\/code> olabilir veya opsiyonel olarak bir d\u00f6n\u00fc\u015f de\u011feri i\u00e7erebilir.<br \/>\n*   <code>done<\/code>: Bir boolean de\u011ferdir. <code>false<\/code> ise iterasyonun devam etti\u011fini ve <code>value<\/code> \u00f6zelli\u011finin ge\u00e7erli bir eleman i\u00e7erdi\u011fini g\u00f6sterir. <code>true<\/code> ise iterasyonun tamamland\u0131\u011f\u0131n\u0131 ve <code>value<\/code> \u00f6zelli\u011finin son de\u011feri (veya <code>undefined<\/code>) i\u00e7erdi\u011fini g\u00f6sterir.<\/p>\n<p>Bir iterator nesnesi, iterasyonun mevcut durumunu (yani hangi eleman\u0131n s\u0131radaki oldu\u011funu) kendi i\u00e7inde tutar. Bu, her <code>next()<\/code> \u00e7a\u011fr\u0131s\u0131n\u0131n bir sonraki eleman\u0131 d\u00f6nd\u00fcrmesini ve iterasyonun do\u011fru s\u0131rayla ilerlemesini sa\u011flar.<\/p>\n<p><strong>Manuel Iterasyon \u00d6rne\u011fi:<\/strong><\/p>\n<p>Yerle\u015fik bir iterable olan bir dizinin iterator&#8217;\u0131n\u0131 al\u0131p manuel olarak nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 g\u00f6relim:<\/p>\n<pre><code class=\"language-javascript\">const numbers = [1, 2, 3];\r\nconst iterator = numbers[Symbol.iterator](); \/\/ Dizinin iterator'\u0131n\u0131 al\u0131yoruz\r\n\r\nconsole.log(iterator.next()); \/\/ { value: 1, done: false }\r\nconsole.log(iterator.next()); \/\/ { value: 2, done: false }\r\nconsole.log(iterator.next()); \/\/ { value: 3, done: false }\r\nconsole.log(iterator.next()); \/\/ { value: undefined, done: true } (\u0130terasyon bitti)\r\nconsole.log(iterator.next()); \/\/ { value: undefined, done: true } (Sonraki \u00e7a\u011fr\u0131lar da ayn\u0131 sonucu verir)<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>numbers[Symbol.iterator]()<\/code> \u00e7a\u011fr\u0131s\u0131 bize bir iterator nesnesi d\u00f6nd\u00fcr\u00fcr. Bu iterator, <code>numbers<\/code> dizisi \u00fczerinde gezinmek i\u00e7in \u00f6zel olarak tasarlanm\u0131\u015ft\u0131r. Her <code>next()<\/code> \u00e7a\u011fr\u0131s\u0131, dizinin bir sonraki eleman\u0131n\u0131 <code>value<\/code> olarak d\u00f6nd\u00fcr\u00fcr ve <code>done<\/code> \u00f6zelli\u011fini <code>false<\/code> olarak ayarlar. T\u00fcm elemanlar t\u00fckendi\u011finde, <code>next()<\/code> metodu <code>done: true<\/code> olan bir obje d\u00f6nd\u00fcr\u00fcr, bu da iterasyonun sona erdi\u011fini g\u00f6sterir.<\/p>\n<p>Iterator&#8217;lar, veri ak\u0131\u015f\u0131n\u0131 talep \u00fczerine (lazy evaluation) sa\u011flamalar\u0131 nedeniyle \u00f6zellikle b\u00fcy\u00fck veya sonsuz veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken bellek verimlili\u011fi a\u00e7\u0131s\u0131ndan \u00f6nemlidir. Bir iterator, t\u00fcm veri k\u00fcmesini belle\u011fe y\u00fcklemek yerine, yaln\u0131zca ihtiya\u00e7 duyuldu\u011funda bir sonraki eleman\u0131 \u00fcretir.<\/p>\n<h3><code>for...of<\/code> D\u00f6ng\u00fcs\u00fc ve Iterasyon<\/h3>\n<p><code>for...of<\/code> d\u00f6ng\u00fcs\u00fc, JavaScript&#8217;te iterables \u00fczerinde gezinmek i\u00e7in tasarlanm\u0131\u015f modern ve okunabilir bir yap\u0131d\u0131r. ES6 ile tan\u0131t\u0131lan bu d\u00f6ng\u00fc, iterable protokol\u00fcn\u00fc kullanan herhangi bir nesne \u00fczerinde do\u011frudan \u00e7al\u0131\u015fabilir. <code>for...of<\/code> d\u00f6ng\u00fcs\u00fc, asl\u0131nda arkada <code>[Symbol.iterator]<\/code> metodunu \u00e7a\u011f\u0131rarak bir iterator al\u0131r ve bu iterator&#8217;\u0131n <code>next()<\/code> metodunu otomatik olarak \u00e7a\u011f\u0131rarak elemanlar\u0131 s\u0131ras\u0131yla d\u00f6nd\u00fcr\u00fcr. <code>done: true<\/code> de\u011feri d\u00f6nd\u00fc\u011f\u00fcnde d\u00f6ng\u00fc otomatik olarak sona erer.<\/p>\n<p><strong><code>for...of<\/code> Kullan\u0131m \u00d6rnekleri:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ Dizi \u00fczerinde\r\nconst colors = ['red', 'green', 'blue'];\r\nfor (const color of colors) {\r\n  console.log(color);\r\n}\r\n\/\/ \u00c7\u0131kt\u0131: red, green, blue\r\n\r\n\/\/ Dize \u00fczerinde\r\nconst message = &quot;JavaScript&quot;;\r\nfor (const char of message) {\r\n  console.log(char);\r\n}\r\n\/\/ \u00c7\u0131kt\u0131: J, a, v, a, S, c, r, i, p, t\r\n\r\n\/\/ Map \u00fczerinde\r\nconst userRoles = new Map([['admin', 'Alice'], ['editor', 'Bob']]);\r\nfor (const [role, name] of userRoles) { \/\/ Destructuring kullanarak anahtar ve de\u011feri do\u011frudan alabiliriz\r\n  console.log(<code>${name} is an ${role}<\/code>);\r\n}\r\n\/\/ \u00c7\u0131kt\u0131: Alice is an admin, Bob is an editor\r\n\r\n\/\/ Set \u00fczerinde\r\nconst uniqueNumbers = new Set([5, 10, 15]);\r\nfor (const num of uniqueNumbers) {\r\n  console.log(num);\r\n}\r\n\/\/ \u00c7\u0131kt\u0131: 5, 10, 15<\/code><\/pre>\n<p><strong><code>for...of<\/code> ve Di\u011fer D\u00f6ng\u00fcler Aras\u0131ndaki Farklar:<\/strong><\/p>\n<p>*   <strong><code>for<\/code> d\u00f6ng\u00fcs\u00fc:<\/strong> Geleneksel <code>for<\/code> d\u00f6ng\u00fcs\u00fc, bir sayac\u0131n kontrol\u00fcnde \u00e7al\u0131\u015f\u0131r ve genellikle dizilerin indeksleri \u00fczerinde gezinmek i\u00e7in kullan\u0131l\u0131r. <code>for...of<\/code>&#8216;a g\u00f6re daha fazla manuel kontrol gerektirir.<\/p>\n<pre><code class=\"language-javascript\">const arr = [1, 2, 3];\r\n    for (let i = 0; i &lt; arr.length; i++) {\r\n      console.log(arr[i]);\r\n    }<\/code><\/pre>\n<p>*   <strong><code>for...in<\/code> d\u00f6ng\u00fcs\u00fc:<\/strong> Bu d\u00f6ng\u00fc, nesnelerin numaraland\u0131r\u0131labilir (enumerable) \u00f6zellik anahtarlar\u0131 \u00fczerinde gezinmek i\u00e7in tasarlanm\u0131\u015ft\u0131r. Dizilerle kullan\u0131ld\u0131\u011f\u0131nda indeksleri d\u00f6nd\u00fcr\u00fcr, ancak prototip zincirindeki \u00f6zellikleri de dahil edebilir ve s\u0131ras\u0131 garanti de\u011fildir. Bu nedenle diziler i\u00e7in <code>for...of<\/code> tercih edilir.<\/p>\n<pre><code class=\"language-javascript\">const obj = { a: 1, b: 2 };\r\n    for (const key in obj) {\r\n      console.log(key, obj[key]); \/\/ a 1, b 2\r\n    }\r\n\r\n    const arr = [1, 2, 3];\r\n    for (const index in arr) {\r\n      console.log(index, arr[index]); \/\/ 0 1, 1 2, 2 3\r\n    }<\/code><\/pre>\n<p>*   <strong><code>Array.prototype.forEach()<\/code>:<\/strong> Bu metod yaln\u0131zca diziler i\u00e7in kullan\u0131labilir ve bir callback fonksiyonu al\u0131r. <code>break<\/code> veya <code>return<\/code> ile d\u00f6ng\u00fcy\u00fc erken sonland\u0131rma imkan\u0131 sunmaz (callback&#8217;ten <code>return<\/code> sadece o iterasyonu atlar, d\u00f6ng\u00fcy\u00fc de\u011fil). <code>for...of<\/code> ise <code>break<\/code>, <code>continue<\/code> ve <code>return<\/code> (bir fonksiyonda ise) ifadelerini destekler.<\/p>\n<pre><code class=\"language-javascript\">const arr = [1, 2, 3];\r\n    arr.forEach(item =&gt; console.log(item));<\/code><\/pre>\n<p><code>for...of<\/code> d\u00f6ng\u00fcs\u00fc, iterable protokol\u00fcn\u00fc kullanarak farkl\u0131 veri yap\u0131lar\u0131 \u00fczerinde tutarl\u0131 ve sezgisel bir \u015fekilde gezinme imkan\u0131 sunar. Bu, kodu daha okunakl\u0131 ve bak\u0131m\u0131 daha kolay hale getirir.<\/p>\n<h3>Kendi Iterable Nesnelerimizi Olu\u015fturma<\/h3>\n<p>JavaScript&#8217;te kendi \u00f6zel iterable nesnelerimizi olu\u015fturmak, <code>[Symbol.iterator]<\/code> metodunu implemente etmekle m\u00fcmk\u00fcnd\u00fcr. Bu metot, \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda bir iterator nesnesi d\u00f6nd\u00fcrmelidir. Iterator nesnesinin ise, her \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda <code>{ value: any, done: boolean }<\/code> \u015feklinde bir obje d\u00f6nd\u00fcren bir <code>next()<\/code> metoduna sahip olmas\u0131 gerekir.<\/p>\n<p>Bu s\u00fcreci elle yapmak biraz karma\u015f\u0131k olabilir \u00e7\u00fcnk\u00fc iterasyon durumunu (hangi eleman\u0131n s\u0131rada oldu\u011funu) manuel olarak y\u00f6netmek gerekir. Ancak, jenerat\u00f6r fonksiyonlar\u0131 (generator functions) bu s\u00fcreci inan\u0131lmaz derecede basitle\u015ftirir.<\/p>\n<p><strong>Manuel Olarak Iterable Olu\u015fturma \u00d6rne\u011fi (Daha Anla\u015f\u0131l\u0131r Olmas\u0131 \u0130\u00e7in):<\/strong><\/p>\n<p>Bir say\u0131 aral\u0131\u011f\u0131 \u00fczerinde yinelenebilen basit bir <code>Range<\/code> s\u0131n\u0131f\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-javascript\">class Range {\r\n  constructor(start, end) {\r\n    this.start = start;\r\n    this.end = end;\r\n  }\r\n\r\n  [Symbol.iterator]() {\r\n    let current = this.start;\r\n    const end = this.end;\r\n\r\n    return {\r\n      next() {\r\n        if (current &lt;= end) {\r\n          return { value: current++, done: false };\r\n        } else {\r\n          return { value: undefined, done: true };\r\n        }\r\n      }\r\n    };\r\n  }\r\n}\r\n\r\nconst myRange = new Range(1, 5);\r\nfor (const num of myRange) {\r\n  console.log(num); \/\/ 1, 2, 3, 4, 5\r\n}\r\n\r\n\/\/ Birden fazla iterasyon da ba\u011f\u0131ms\u0131z \u00e7al\u0131\u015f\u0131r\r\nconst iterator1 = myRange[Symbol.iterator]();\r\nconst iterator2 = myRange[Symbol.iterator]();\r\n\r\nconsole.log(iterator1.next()); \/\/ { value: 1, done: false }\r\nconsole.log(iterator2.next()); \/\/ { value: 1, done: false }<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>Range<\/code> s\u0131n\u0131f\u0131 <code>[Symbol.iterator]<\/code> metodunu implemente ediyor. Bu metot, <code>next()<\/code> metoduna sahip bir obje d\u00f6nd\u00fcr\u00fcyor. <code>next()<\/code> metodu ise <code>current<\/code> de\u011fi\u015fkenini kullanarak iterasyon durumunu y\u00f6netiyor ve <code>start<\/code> de\u011ferinden <code>end<\/code> de\u011ferine kadar olan say\u0131lar\u0131 s\u0131ras\u0131yla d\u00f6nd\u00fcr\u00fcyor. <code>current<\/code> de\u011feri <code>end<\/code> de\u011ferini a\u015ft\u0131\u011f\u0131nda, <code>done: true<\/code> d\u00f6nd\u00fcrerek iterasyonun bitti\u011fini bildiriyor.<\/p>\n<p><strong>Jenerat\u00f6r Fonksiyonlar\u0131 ile Iterable Olu\u015fturma:<\/strong><\/p>\n<p>Jenerat\u00f6r fonksiyonlar\u0131, iterable ve iterator protokollerini uygulamak i\u00e7in \u00e7ok daha basit ve zarif bir yol sunar. <code>function*<\/code> s\u00f6zdizimi ile tan\u0131mlanan jenerat\u00f6r fonksiyonlar\u0131, <code>yield<\/code> anahtar kelimesini kullanarak iterasyon de\u011ferlerini ad\u0131m ad\u0131m d\u00f6nd\u00fcrebilir. Bir jenerat\u00f6r fonksiyonu \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, otomatik olarak bir jenerat\u00f6r nesnesi (ayn\u0131 zamanda bir iterator) d\u00f6nd\u00fcr\u00fcr. Bu jenerat\u00f6r nesnesi, <code>next()<\/code> metoduna sahiptir ve <code>yield<\/code> ifadeleri aras\u0131nda y\u00fcr\u00fctmeyi duraklat\u0131p devam ettirebilir.<\/p>\n<p>Yukar\u0131daki <code>Range<\/code> \u00f6rne\u011fini jenerat\u00f6r fonksiyonu ile yeniden yazal\u0131m:<\/p>\n<pre><code class=\"language-javascript\">class RangeWithGenerator {\r\n  constructor(start, end) {\r\n    this.start = start;\r\n    this.end = end;\r\n  }\r\n\r\n  <em>[Symbol.iterator]() { \/\/ function<\/em> syntax'\u0131 ile jenerat\u00f6r metodu tan\u0131ml\u0131yoruz\r\n    for (let i = this.start; i &lt;= this.end; i++) {\r\n      yield i; \/\/ Her yield ifadesi, next() \u00e7a\u011fr\u0131s\u0131nda d\u00f6nd\u00fcr\u00fclecek de\u011feri belirler\r\n    }\r\n  }\r\n}\r\n\r\nconst myRangeGen = new RangeWithGenerator(6, 10);\r\nfor (const num of myRangeGen) {\r\n  console.log(num); \/\/ 6, 7, 8, 9, 10\r\n}<\/code><\/pre>\n<p>Bu versiyon, <code>[Symbol.iterator]<\/code> metodunun bir jenerat\u00f6r fonksiyonu olarak tan\u0131mlanmas\u0131 sayesinde \u00e7ok daha k\u0131sa ve okunabilir hale gelmi\u015ftir. <code>yield i<\/code> ifadesi, her iterasyon ad\u0131m\u0131nda <code>i<\/code> de\u011ferini d\u00f6nd\u00fcr\u00fcr. <code>for<\/code> d\u00f6ng\u00fcs\u00fc bitti\u011finde, jenerat\u00f6r otomatik olarak <code>done: true<\/code> d\u00f6nd\u00fcr\u00fcr. Jenerat\u00f6r fonksiyonlar\u0131, \u00f6zel iterator&#8217;lar olu\u015fturman\u0131n standart ve tercih edilen yoludur.<\/p>\n<h3>Jenerat\u00f6r Fonksiyonlar\u0131 Derinlemesine<\/h3>\n<p>Jenerat\u00f6r fonksiyonlar\u0131, JavaScript&#8217;in en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biridir ve iterasyonun \u00f6tesinde de bir\u00e7ok kullan\u0131m alan\u0131na sahiptir. Bir jenerat\u00f6r fonksiyonu, <code>function*<\/code> s\u00f6zdizimi ile tan\u0131mlan\u0131r:<\/p>\n<pre><code class=\"language-javascript\">function* myGenerator() {\r\n  yield 1;\r\n  yield 2;\r\n  yield 3;\r\n}<\/code><\/pre>\n<p>Bir jenerat\u00f6r fonksiyonu \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, kodu hemen \u00e7al\u0131\u015ft\u0131rmaz. Bunun yerine, bir <strong>jenerat\u00f6r nesnesi<\/strong> d\u00f6nd\u00fcr\u00fcr. Bu jenerat\u00f6r nesnesi, ayn\u0131 zamanda bir iterator&#8217;d\u0131r ve <code>next()<\/code>, <code>return()<\/code> ve <code>throw()<\/code> gibi metodlara sahiptir.<\/p>\n<pre><code class=\"language-javascript\">const gen = myGenerator(); \/\/ Jenerat\u00f6r nesnesi d\u00f6nd\u00fcr\u00fcl\u00fcr, kod hen\u00fcz \u00e7al\u0131\u015fmaz\r\n\r\nconsole.log(gen.next()); \/\/ { value: 1, done: false } - \u0130lk yield'e kadar \u00e7al\u0131\u015f\u0131r\r\nconsole.log(gen.next()); \/\/ { value: 2, done: false } - \u0130kinci yield'e kadar \u00e7al\u0131\u015f\u0131r\r\nconsole.log(gen.next()); \/\/ { value: 3, done: false } - \u00dc\u00e7\u00fcnc\u00fc yield'e kadar \u00e7al\u0131\u015f\u0131r\r\nconsole.log(gen.next()); \/\/ { value: undefined, done: true } - Fonksiyon bitti<\/code><\/pre>\n<p><strong><code>yield<\/code> ve <code>return<\/code> Fark\u0131:<\/strong><\/p>\n<p>*   <code>yield<\/code>: Jenerat\u00f6r\u00fcn y\u00fcr\u00fct\u00fclmesini duraklat\u0131r, bir de\u011fer d\u00f6nd\u00fcr\u00fcr ve <code>next()<\/code> tekrar \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda kald\u0131\u011f\u0131 yerden devam eder. Bir jenerat\u00f6rde birden fazla <code>yield<\/code> ifadesi olabilir.<br \/>\n*   <code>return<\/code>: Jenerat\u00f6r\u00fcn y\u00fcr\u00fct\u00fclmesini tamamen sonland\u0131r\u0131r. <code>return<\/code> ifadesinden sonra jenerat\u00f6rden \u00e7a\u011fr\u0131lan <code>next()<\/code> metodlar\u0131 her zaman <code>{ value: undefined, done: true }<\/code> d\u00f6nd\u00fcr\u00fcr. Bir jenerat\u00f6rde bir <code>return<\/code> ifadesi varsa, bu, <code>done: true<\/code> ile d\u00f6nd\u00fcr\u00fclen son <code>value<\/code> \u00f6zelli\u011fini belirler.<\/p>\n<pre><code class=\"language-javascript\">function* returnGenerator() {\r\n      yield 'A';\r\n      return 'B'; \/\/ Jenerat\u00f6r burada biter\r\n      yield 'C'; \/\/ Bu k\u0131s\u0131m asla \u00e7al\u0131\u015fmaz\r\n    }\r\n\r\n    const retGen = returnGenerator();\r\n    console.log(retGen.next()); \/\/ { value: 'A', done: false }\r\n    console.log(retGen.next()); \/\/ { value: 'B', done: true }\r\n    console.log(retGen.next()); \/\/ { value: undefined, done: true }<\/code><\/pre>\n<p><strong>Jenerat\u00f6r Metodlar\u0131:<\/strong><\/p>\n<p>*   <strong><code>iterator.next(value)<\/code>:<\/strong> Jenerat\u00f6r\u00fcn y\u00fcr\u00fct\u00fclmesine devam eder. \u0130ste\u011fe ba\u011fl\u0131 olarak, <code>yield<\/code> ifadesinin sonucunu belirlemek i\u00e7in bir de\u011fer g\u00f6nderebilirsiniz.<\/p>\n<pre><code class=\"language-javascript\">function* inputGenerator() {\r\n      const name = yield &quot;Ad\u0131n\u0131z nedir?&quot;;\r\n      console.log(<code>Merhaba, ${name}!<\/code>);\r\n      yield &quot;Te\u015fekk\u00fcrler!&quot;;\r\n    }\r\n\r\n    const inputGen = inputGenerator();\r\n    console.log(inputGen.next().value); \/\/ Ad\u0131n\u0131z nedir?\r\n    console.log(inputGen.next(&quot;Alice&quot;).value); \/\/ Merhaba, Alice! (konsola yaz\u0131l\u0131r), Te\u015fekk\u00fcrler!\r\n    console.log(inputGen.next()); \/\/ { value: undefined, done: true }<\/code><\/pre>\n<p>*   <strong><code>iterator.return(value)<\/code>:<\/strong> Jenerat\u00f6r\u00fcn y\u00fcr\u00fct\u00fclmesini sonland\u0131r\u0131r ve verilen <code>value<\/code> ile <code>done: true<\/code> d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code class=\"language-javascript\">const gen = myGenerator();\r\n    console.log(gen.next()); \/\/ { value: 1, done: false }\r\n    console.log(gen.return('Erken Biti\u015f')); \/\/ { value: 'Erken Biti\u015f', done: true }\r\n    console.log(gen.next()); \/\/ { value: undefined, done: true }<\/code><\/pre>\n<p>*   <strong><code>iterator.throw(error)<\/code>:<\/strong> Jenerat\u00f6r\u00fcn i\u00e7ine bir hata f\u0131rlat\u0131r. Bu hata, jenerat\u00f6r i\u00e7inde <code>try...catch<\/code> blo\u011fu ile yakalanabilir. Yakalanmazsa, jenerat\u00f6r sonlan\u0131r ve hata d\u0131\u015far\u0131ya yay\u0131l\u0131r.<\/p>\n<pre><code class=\"language-javascript\">function* errorGenerator() {\r\n      try {\r\n        yield 1;\r\n        yield 2;\r\n      } catch (e) {\r\n        console.error(&quot;Hata yakaland\u0131:&quot;, e);\r\n      }\r\n      yield 3; \/\/ Hata yakaland\u0131\u011f\u0131 i\u00e7in bu k\u0131s\u0131m \u00e7al\u0131\u015f\u0131r\r\n    }\r\n\r\n    const errGen = errorGenerator();\r\n    console.log(errGen.next()); \/\/ { value: 1, done: false }\r\n    console.log(errGen.throw(new Error(&quot;Bir hata olu\u015ftu!&quot;))); \/\/ Hata yakaland\u0131: Error: Bir hata olu\u015ftu! { value: 3, done: false }\r\n    console.log(errGen.next()); \/\/ { value: undefined, done: true }<\/code><\/pre>\n<p><strong>Jenerat\u00f6rlerin Pratik Kullan\u0131m Alanlar\u0131:<\/strong><\/p>\n<p>*   <strong>Sonsuz Seriler:<\/strong> Fibonacci serisi gibi sonsuz veri dizileri olu\u015fturmak. Belle\u011fi doldurmadan, sadece ihtiya\u00e7 duyuldu\u011funda bir sonraki eleman\u0131 \u00fcretir.<br \/>\n*   <strong>Asenkron Kod Y\u00f6netimi:<\/strong> Promise tabanl\u0131 asenkron kodlar\u0131 daha s\u0131ral\u0131 ve senkron gibi yazmak i\u00e7in (async\/await&#8217;ten \u00f6nce pop\u00fclerdi, ancak hala baz\u0131 durumlarda ge\u00e7erlidir).<br \/>\n*   <strong>Durum Makineleri:<\/strong> Bir dizi durumu ve bu durumlar aras\u0131ndaki ge\u00e7i\u015fleri y\u00f6netmek.<br \/>\n*   <strong>Lazy Evaluation (Tembel De\u011ferlendirme):<\/strong> B\u00fcy\u00fck veri k\u00fcmelerini veya pahal\u0131 hesaplamalar\u0131 yaln\u0131zca sonu\u00e7lar\u0131na ihtiya\u00e7 duyuldu\u011funda ger\u00e7ekle\u015ftirmek.<\/p>\n<p>Jenerat\u00f6rler, karma\u015f\u0131k iterasyon mant\u0131klar\u0131n\u0131 ve veri ak\u0131\u015flar\u0131n\u0131 y\u00f6netmek i\u00e7in son derece g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r.<\/p>\n<h3>Asenkron Iterat\u00f6rler ve <code>for await...of<\/code><\/h3>\n<p>Modern web uygulamalar\u0131nda asenkron i\u015flemler (API \u00e7a\u011fr\u0131lar\u0131, dosya okuma\/yazma, veri ak\u0131\u015flar\u0131 vb.) yayg\u0131nd\u0131r. ES2018 ile birlikte tan\u0131t\u0131lan asenkron iterat\u00f6rler ve <code>for await...of<\/code> d\u00f6ng\u00fcs\u00fc, bu asenkron veri kaynaklar\u0131 \u00fczerinde t\u0131pk\u0131 senkron iterasyon yapar gibi kolayca gezinmemizi sa\u011flar.<\/p>\n<p>Bir nesnenin &#8220;asenkron iterable&#8221; (yinelenebilir) olmas\u0131 i\u00e7in, <code>[Symbol.asyncIterator]<\/code> ad\u0131nda bir metoda sahip olmas\u0131 gerekir. Bu metot, \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda bir &#8220;asenkron iterator&#8221; d\u00f6nd\u00fcr\u00fcr. Asenkron iterator&#8217;\u0131n <code>next()<\/code> metodu ise, her zaman bir <code>Promise<\/code> d\u00f6nd\u00fcrmelidir. Bu <code>Promise<\/code>, <code>{ value: any, done: boolean }<\/code> format\u0131nda bir obje ile \u00e7\u00f6z\u00fcmlenir.<\/p>\n<p><strong>Asenkron Iterator Protokol\u00fc:<\/strong><\/p>\n<p>1.  <strong>Asenkron Iterable:<\/strong> <code>[Symbol.asyncIterator]()<\/code> metoduna sahip bir nesne. Bu metot, bir asenkron iterator d\u00f6nd\u00fcrmelidir.<br \/>\n2.  <strong>Asenkron Iterator:<\/strong> <code>next()<\/code> metoduna sahip bir nesne. Bu <code>next()<\/code> metodu, <code>{ value: any, done: boolean }<\/code> objesi ile \u00e7\u00f6z\u00fcmlenen bir <code>Promise<\/code> d\u00f6nd\u00fcrmelidir.<\/p>\n<p><strong><code>for await...of<\/code> D\u00f6ng\u00fcs\u00fc:<\/strong><\/p>\n<p><code>for await...of<\/code> d\u00f6ng\u00fcs\u00fc, asenkron iterables \u00fczerinde gezinmek i\u00e7in kullan\u0131l\u0131r. Her iterasyon ad\u0131m\u0131nda, <code>next()<\/code> metodunun d\u00f6nd\u00fcrd\u00fc\u011f\u00fc <code>Promise<\/code>&#8216;\u0131n \u00e7\u00f6z\u00fclmesini bekler ve ard\u0131ndan <code>value<\/code> \u00f6zelli\u011fini al\u0131r.<\/p>\n<p><strong>Asenkron Jenerat\u00f6r Fonksiyonlar\u0131:<\/strong><\/p>\n<p>T\u0131pk\u0131 senkron iterables&#8217;ta oldu\u011fu gibi, asenkron jenerat\u00f6r fonksiyonlar\u0131 da asenkron iterator&#8217;lar olu\u015fturman\u0131n en kolay yoludur. <code>async function*<\/code> s\u00f6zdizimi ile tan\u0131mlan\u0131r ve <code>yield<\/code> anahtar kelimesi ile <code>Promise<\/code>&#8216;lar\u0131 veya do\u011frudan de\u011ferleri d\u00f6nd\u00fcrebilir.<\/p>\n<p><strong>\u00d6rnek: Asenkron Veri Ak\u0131\u015f\u0131 Sim\u00fclasyonu<\/strong><\/p>\n<p>Bir API&#8217;den par\u00e7a par\u00e7a veri \u00e7ekti\u011fimizi ve her \u00e7eki\u015fin bir <code>Promise<\/code> d\u00f6nd\u00fcrd\u00fc\u011f\u00fcn\u00fc varsayal\u0131m:<\/p>\n<pre><code class=\"language-javascript\">async function* fetchDataChunks() {\r\n  let chunkCount = 0;\r\n  const totalChunks = 3;\r\n\r\n  while (chunkCount &lt; totalChunks) {\r\n    chunkCount++;\r\n    console.log(<code>Veri par\u00e7as\u0131 ${chunkCount} bekleniyor...<\/code>);\r\n    \/\/ Ger\u00e7ek bir senaryoda burada bir fetch() veya ba\u015fka bir async i\u015flem olurdu\r\n    await new Promise(resolve =&gt; setTimeout(resolve, 1000)); \/\/ 1 saniye bekle\r\n    yield <code>Veri par\u00e7as\u0131 ${chunkCount}<\/code>;\r\n  }\r\n  console.log(&quot;T\u00fcm veri par\u00e7alar\u0131 al\u0131nd\u0131.&quot;);\r\n}\r\n\r\nasync function processDataStream() {\r\n  console.log(&quot;Veri ak\u0131\u015f\u0131 ba\u015fl\u0131yor.&quot;);\r\n  for await (const chunk of fetchDataChunks()) {\r\n    console.log(<code>\u0130\u015flenen: ${chunk}<\/code>);\r\n  }\r\n  console.log(&quot;Veri ak\u0131\u015f\u0131 tamamland\u0131.&quot;);\r\n}\r\n\r\nprocessDataStream();\r\n\/*\r\n\u00c7\u0131kt\u0131 (yakla\u015f\u0131k 1 saniye aral\u0131klarla):\r\nVeri ak\u0131\u015f\u0131 ba\u015fl\u0131yor.\r\nVeri par\u00e7as\u0131 1 bekleniyor...\r\n\u0130\u015flenen: Veri par\u00e7as\u0131 1\r\nVeri par\u00e7as\u0131 2 bekleniyor...\r\n\u0130\u015flenen: Veri par\u00e7as\u0131 2\r\nVeri par\u00e7as\u0131 3 bekleniyor...\r\n\u0130\u015flenen: Veri par\u00e7as\u0131 3\r\nT\u00fcm veri par\u00e7alar\u0131 al\u0131nd\u0131.\r\nVeri ak\u0131\u015f\u0131 tamamland\u0131.\r\n*\/<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>fetchDataChunks<\/code> bir <code>async function*<\/code>&#8216;t\u0131r. Her <code>yield<\/code> ifadesi \u00f6ncesinde bir <code>await<\/code> i\u015flemiyle sim\u00fcle edilmi\u015f bir asenkron bekleyi\u015f vard\u0131r. <code>for await (const chunk of fetchDataChunks())<\/code> d\u00f6ng\u00fcs\u00fc, her <code>yield<\/code> edilen <code>Promise<\/code>&#8216;\u0131n \u00e7\u00f6z\u00fclmesini bekler ve \u00e7\u00f6z\u00fcmlenen de\u011feri <code>chunk<\/code> de\u011fi\u015fkenine atar. Bu sayede, asenkron veri ak\u0131\u015flar\u0131 \u00fczerinde senkron bir d\u00f6ng\u00fc yaz\u0131yormu\u015f gibi rahat\u00e7a \u00e7al\u0131\u015fabiliriz.<\/p>\n<p>Asenkron iterat\u00f6rler, \u00f6zellikle Node.js&#8217;te dosya okuma ak\u0131\u015flar\u0131, a\u011f ak\u0131\u015flar\u0131 veya di\u011fer zaman alan i\u015flemlerle \u00e7al\u0131\u015f\u0131rken olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r. Geleneksel callback&#8217;ler veya zincirlenmi\u015f <code>then()<\/code> \u00e7a\u011fr\u0131lar\u0131 yerine, daha temiz ve s\u0131ral\u0131 bir kod yap\u0131s\u0131 sunar.<\/p>\n<h3>Iterables ve Iterat\u00f6rlerin Avantajlar\u0131<\/h3>\n<p>Iterables ve Iterators&#8217;\u0131n JavaScript ekosistemine getirdi\u011fi faydalar olduk\u00e7a \u00e7e\u015fitlidir:<\/p>\n<p>*   <strong>Standardizasyon:<\/strong> Farkl\u0131 veri yap\u0131lar\u0131 \u00fczerinde gezinmek i\u00e7in tek ve birle\u015fik bir protokol sa\u011flar. Bu, geli\u015ftiricilerin farkl\u0131 koleksiyon t\u00fcrleri i\u00e7in farkl\u0131 d\u00f6ng\u00fc mekanizmalar\u0131 \u00f6\u011frenmek zorunda kalmamas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>Bellek Verimlili\u011fi (Lazy Evaluation):<\/strong> \u00d6zellikle jenerat\u00f6rler arac\u0131l\u0131\u011f\u0131yla, veri k\u00fcmelerinin tamam\u0131n\u0131 belle\u011fe y\u00fcklemek yerine, yaln\u0131zca ihtiya\u00e7 duyuldu\u011funda bir sonraki eleman\u0131 \u00fcreterek bellek kullan\u0131m\u0131n\u0131 optimize eder. Bu, b\u00fcy\u00fck veya sonsuz veri setleriyle \u00e7al\u0131\u015f\u0131rken kritik \u00f6neme sahiptir.<br \/>\n*   <strong>Kod Okunabilirli\u011fi ve Bak\u0131m Kolayl\u0131\u011f\u0131:<\/strong> <code>for...of<\/code> d\u00f6ng\u00fcs\u00fc, iterasyon kodunu daha sezgisel ve anla\u015f\u0131l\u0131r hale getirir. Jenerat\u00f6rler, karma\u015f\u0131k iterasyon mant\u0131klar\u0131n\u0131 daha deklaratif bir \u015fekilde ifade etmeye olanak tan\u0131r.<br \/>\n*   <strong>Composability (Bile\u015ftirilebilirlik):<\/strong> Iterat\u00f6rler, birbirine zincirlenebilir veya birle\u015ftirilebilir. \u00d6rne\u011fin, bir iterator&#8217;dan al\u0131nan veriyi ba\u015fka bir iterator ile i\u015fleyebiliriz (\u00f6rne\u011fin, map, filter gibi fonksiyonlar bu prensiple \u00e7al\u0131\u015f\u0131r).<br \/>\n*   <strong>Soyutlama:<\/strong> Veri kayna\u011f\u0131n\u0131n nas\u0131l depoland\u0131\u011f\u0131ndan veya \u00fcretildi\u011finden ba\u011f\u0131ms\u0131z olarak, elemanlara eri\u015fim i\u00e7in tutarl\u0131 bir aray\u00fcz sunar. Bu, kodun daha mod\u00fcler olmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>Asenkron \u0130\u015flemler \u0130\u00e7in G\u00fc\u00e7l\u00fc Destek:<\/strong> Asenkron iterat\u00f6rler ve <code>for await...of<\/code>, asenkron veri ak\u0131\u015flar\u0131n\u0131 y\u00f6netmeyi \u00f6nemli \u00f6l\u00e7\u00fcde basitle\u015ftirir, callback cehennemini veya karma\u015f\u0131k Promise zincirlerini azalt\u0131r.<br \/>\n*   <strong>Daha \u0130yi Hata Y\u00f6netimi:<\/strong> Jenerat\u00f6rlerin <code>throw()<\/code> metodu ve <code>try...catch<\/code> bloklar\u0131, iterasyon s\u0131ras\u0131nda olu\u015fabilecek hatalar\u0131 daha kontroll\u00fc bir \u015fekilde y\u00f6netme imkan\u0131 sunar.<\/p>\n<p>Bu avantajlar, Iterables ve Iterators&#8217;\u0131 modern JavaScript geli\u015ftirmenin vazge\u00e7ilmez bir par\u00e7as\u0131 haline getirmi\u015ftir. Bir\u00e7ok k\u00fct\u00fcphane ve framework, bu protokollere dayanarak daha esnek ve performansl\u0131 \u00e7\u00f6z\u00fcmler sunar.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Iterables ve Iterators, JavaScript&#8217;in temel ta\u015flar\u0131ndan biri haline gelmi\u015f g\u00fc\u00e7l\u00fc ve esnek kavramlard\u0131r. ES6 ile hayat\u0131m\u0131za giren bu \u00f6zellikler, veri yap\u0131lar\u0131 \u00fczerinde gezinmek i\u00e7in standart bir mekanizma sa\u011flayarak, kodumuzu daha temiz, daha verimli ve daha anla\u015f\u0131l\u0131r hale getirmi\u015ftir. <code>for...of<\/code> d\u00f6ng\u00fcs\u00fc, yerle\u015fik iterables \u00fczerinde kolayca gezinmemizi sa\u011flarken, jenerat\u00f6r fonksiyonlar\u0131 kendi \u00f6zel iterable ve iterator nesnelerimizi olu\u015fturman\u0131n en zarif yolunu sunar.<\/p>\n<p>Asenkron iterat\u00f6rlerin ve <code>for await...of<\/code> d\u00f6ng\u00fcs\u00fcn\u00fcn tan\u0131t\u0131lmas\u0131yla birlikte, JavaScript, asenkron veri ak\u0131\u015flar\u0131n\u0131 y\u00f6netme yetene\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde geli\u015ftirmi\u015ftir. Bu, \u00f6zellikle modern web ve Node.js uygulamalar\u0131nda s\u0131kl\u0131kla kar\u015f\u0131la\u015f\u0131lan API \u00e7a\u011fr\u0131lar\u0131, dosya i\u015flemleri ve a\u011f ileti\u015fimleri gibi senaryolarda geli\u015ftiricilere b\u00fcy\u00fck kolayl\u0131k sa\u011flamaktad\u0131r.<\/p>\n<p>Bu makalede ele al\u0131nan kavramlar\u0131 anlamak ve etkin bir \u015fekilde kullanmak, sadece mevcut JavaScript kodunuzu daha iyi anlaman\u0131za yard\u0131mc\u0131 olmakla kalmayacak, ayn\u0131 zamanda daha ileri d\u00fczeyde, performans odakl\u0131 ve bak\u0131m\u0131 kolay uygulamalar geli\u015ftirmenizin \u00f6n\u00fcn\u00fc a\u00e7acakt\u0131r. Iterables ve Iterators, JavaScript&#8217;in dinamik do\u011fas\u0131n\u0131 ve s\u00fcrekli geli\u015fimini temsil eden, her geli\u015ftiricinin ara\u00e7 kutusunda bulunmas\u0131 gereken temel ara\u00e7lard\u0131r. Bu konular \u00fczerinde pratik yaparak ve farkl\u0131 senaryolarda uygulayarak bilginizi peki\u015ftirmeniz, JavaScript yolculu\u011funuzda size \u00f6nemli bir avantaj sa\u011flayacakt\u0131r.<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/javascript-iterables-iterators-generators-async\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/javascript-iterables-iterators-generators-async<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"JavaScript&#8217;te Iterables ve Iterators&#8217;a Giri\u015f JavaScript, dinamik ve esnek bir programlama dili olarak, verilerle \u00e7al\u0131\u015fmak i\u00e7in \u00e7e\u015fitli yap\u0131lar sunar.","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[129],"tags":[],"class_list":{"0":"post-41770","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-javascript","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>JavaScript&#039;te Iterables ve Iterators&#039;a Giri\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JavaScript&#039;te Iterables ve Iterators&#039;a Giri\u015f\" \/>\n<meta property=\"og:description\" content=\"JavaScript&#039;te Iterables ve Iterators&#039;a Giri\u015f JavaScript, dinamik ve esnek bir programlama dili olarak, verilerle \u00e7al\u0131\u015fmak i\u00e7in \u00e7e\u015fitli yap\u0131lar sunar.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-15T05:00:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-15T08:16:56+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"JavaScript&#8217;te Iterables ve Iterators&#8217;a Giri\u015f\",\"datePublished\":\"2026-05-15T05:00:48+00:00\",\"dateModified\":\"2026-05-15T08:16:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/\"},\"wordCount\":2647,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Javascript\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/\",\"name\":\"JavaScript'te Iterables ve Iterators'a Giri\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-05-15T05:00:48+00:00\",\"dateModified\":\"2026-05-15T08:16:56+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JavaScript&#8217;te Iterables ve Iterators&#8217;a Giri\u015f\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"JavaScript'te Iterables ve Iterators'a Giri\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/","og_locale":"tr_TR","og_type":"article","og_title":"JavaScript'te Iterables ve Iterators'a Giri\u015f","og_description":"JavaScript'te Iterables ve Iterators'a Giri\u015f JavaScript, dinamik ve esnek bir programlama dili olarak, verilerle \u00e7al\u0131\u015fmak i\u00e7in \u00e7e\u015fitli yap\u0131lar sunar.","og_url":"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-05-15T05:00:48+00:00","article_modified_time":"2026-05-15T08:16:56+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"12 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"JavaScript&#8217;te Iterables ve Iterators&#8217;a Giri\u015f","datePublished":"2026-05-15T05:00:48+00:00","dateModified":"2026-05-15T08:16:56+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/"},"wordCount":2647,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Javascript"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/","url":"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/","name":"JavaScript'te Iterables ve Iterators'a Giri\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-05-15T05:00:48+00:00","dateModified":"2026-05-15T08:16:56+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-iterables-ve-iteratorsa-giris\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"JavaScript&#8217;te Iterables ve Iterators&#8217;a Giri\u015f"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/41770","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=41770"}],"version-history":[{"count":3,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/41770\/revisions"}],"predecessor-version":[{"id":41794,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/41770\/revisions\/41794"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=41770"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=41770"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=41770"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}