Rumah >hujung hadapan web >tutorial js >Penjelasan terperinci tentang iterator dan penjana dalam kemahiran JavaScript_javascript
Memproses setiap item dalam koleksi ialah operasi yang sangat biasa JavaScript menyediakan banyak cara untuk mengulang koleksi, daripada mudah untuk dan untuk setiap gelung kepada peta(), penapis() dan kefahaman tatasusunan . Dalam JavaScript 1.7, iterator dan penjana membawa mekanisme lelaran baharu kepada sintaks JavaScript teras, dan juga menyediakan mekanisme untuk menyesuaikan gelagat untuk...dalam dan untuk setiap gelung.
Iterator
Lelaran ialah objek yang mengakses satu elemen dalam urutan koleksi pada satu masa dan menjejaki kedudukan semasa lelaran dalam jujukan. Dalam JavaScript, iterator ialah objek yang menyediakan kaedah next() yang mengembalikan elemen seterusnya dalam jujukan. Kaedah ini membuang pengecualian StopIteration apabila semua elemen dalam urutan telah dilalui.
Setelah objek iterator dicipta, ia boleh dipanggil secara eksplisit dengan memanggil next() berulang kali, atau secara tersirat menggunakan JavaScript untuk...dalam dan untuk setiap gelung.
Iterators mudah untuk lelaran ke atas objek dan tatasusunan boleh dibuat menggunakan Iterator():
Setelah pemulaan selesai, kaedah next() boleh dipanggil untuk mengakses pasangan nilai kunci objek dalam urutan:
Gelung untuk…dalam boleh digunakan dan bukannya memanggil kaedah seterusnya() secara eksplisit. Gelung ditamatkan secara automatik apabila pengecualian StopIteration dilemparkan.
Jika anda hanya mahu mengulang nilai kunci objek, anda boleh menghantar parameter kedua ke fungsi Iterator() dengan nilai benar:
Satu faedah menggunakan Iterator() untuk mengakses objek ialah sifat tersuai yang ditambahkan pada Object.prototype tidak akan disertakan dalam objek jujukan.
Iterator() juga boleh digunakan pada tatasusunan:
Sama seperti melintasi objek, menghantar benar sebagai parameter kedua akan menyebabkan traversal menjadi indeks tatasusunan:
Gunakan kata kunci let untuk menetapkan indeks dan nilai untuk menyekat pembolehubah di dalam gelung, dan anda juga boleh menggunakan Tugasan Pemusnahan:
Isytiharkan lelaran tersuai
Sesetengah objek yang mewakili koleksi elemen harus diulang dengan cara yang ditentukan.
1 Mengulang objek yang mewakili julat harus mengembalikan nombor yang terkandung dalam julat satu demi satu
2. Nod daun pokok boleh diakses menggunakan depth-first atau breadth-first
3. Lelaran pada objek yang mewakili hasil pertanyaan pangkalan data harus dikembalikan baris demi baris, walaupun keseluruhan set hasil belum dimuatkan ke dalam tatasusunan tunggal
4. Peulang yang bertindak pada jujukan matematik tak terhingga (seperti jujukan Fibonacci) harus mengembalikan hasil satu demi satu tanpa mencipta struktur data panjang tak terhingga
JavaScript membolehkan anda menulis logik lelaran tersuai dan menggunakannya pada objek
Kami mencipta objek Julat mudah yang mengandungi nilai rendah dan tinggi:
Kini kami mencipta lelaran tersuai yang mengembalikan jujukan yang mengandungi semua integer dalam julat. Antara muka iterator memerlukan kami menyediakan kaedah next() untuk mengembalikan elemen seterusnya dalam jujukan atau membuang pengecualian StopIteration.
RangeIterator kami diwujudkan dengan contoh julat dan mengekalkan sifat semasa untuk menjejaki kedudukan jujukan semasa.
Akhir sekali, untuk RangeIterator digabungkan dengan Range, kita perlu menambah kaedah __iterator__ khas untuk Range. Ia akan dipanggil apabila kami cuba melelarkan Julat dan harus mengembalikan contoh RangeIterator yang melaksanakan logik lelaran.
Setelah kami melengkapkan lelaran tersuai kami, kami boleh mengulangi pada julat contoh:
Penjana: cara yang lebih baik untuk membina iterator
Walaupun iterator tersuai ialah alat yang berguna, perancangan yang teliti diperlukan semasa menciptanya kerana keadaan dalaman mereka perlu dikekalkan dengan jelas.
Penjana menyediakan fungsi yang sangat berkuasa: ia membolehkan anda menentukan fungsi yang mengandungi algoritma lelarannya sendiri, dan ia boleh mengekalkan keadaannya sendiri secara automatik.
Penjana ialah fungsi khas yang boleh berfungsi sebagai kilang lelaran. Jika fungsi mengandungi satu atau lebih ungkapan hasil, ia dipanggil penjana (Nota Penterjemah: Node.js juga perlu menambah * di hadapan nama fungsi untuk menunjukkannya).
Nota: Hanya blok kod yang terkandung dalam