Rumah >hujung hadapan web >tutorial js >Penjelasan terperinci tentang iterator dan penjana dalam kemahiran JavaScript_javascript

Penjelasan terperinci tentang iterator dan penjana dalam kemahiran JavaScript_javascript

WBOY
WBOYasal
2016-05-16 16:32:521460semak imbas

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():

Salin kod Kod adalah seperti berikut:

var lang = { nama: 'JavaScript', tahun lahir: 1995 };
var it = Iterator(lang);

Setelah pemulaan selesai, kaedah next() boleh dipanggil untuk mengakses pasangan nilai kunci objek dalam urutan:

Salin kod Kod adalah seperti berikut:

var pair = it.next(); //Pasangan kunci-nilai ialah ["name", "JavaScript"]
pair = it.next(); //Pasangan kunci-nilai ialah ["hari lahir", 1995]
pair = it.next(); //Pengecualian `StopIteration` dilemparkan

Gelung untuk…dalam boleh digunakan dan bukannya memanggil kaedah seterusnya() secara eksplisit. Gelung ditamatkan secara automatik apabila pengecualian StopIteration dilemparkan.

Salin kod Kod adalah seperti berikut:

var it = Iterator(lang);
untuk (pasangan var di dalamnya)
Print(pair); //Keluarkan satu [kunci, nilai] pasangan nilai kunci di dalamnya setiap kali

Jika anda hanya mahu mengulang nilai kunci objek, anda boleh menghantar parameter kedua ke fungsi Iterator() dengan nilai benar:

Salin kod Kod adalah seperti berikut:

var it = Iterator(lang, true);
untuk (kunci var di dalamnya)
Print(key); //Nilai kunci keluaran setiap kali

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:

Salin kod Kod adalah seperti berikut:

var langs = ['JavaScript', 'Python', 'Haskell'];
var it = Iterator(langs);
untuk (pasangan var di dalamnya)
​ print(pair); //Setiap lelaran mengeluarkan [indeks, bahasa] pasangan nilai kunci

Sama seperti melintasi objek, menghantar benar sebagai parameter kedua akan menyebabkan traversal menjadi indeks tatasusunan:

Salin kod Kod adalah seperti berikut:

var langs = ['JavaScript', 'Python', 'Haskell'];
var it = Iterator(langs, true);
untuk (var i di dalamnya)
​ print(i); //Output 0, kemudian 1, kemudian 2

Gunakan kata kunci let untuk menetapkan indeks dan nilai untuk menyekat pembolehubah di dalam gelung, dan anda juga boleh menggunakan Tugasan Pemusnahan:

Salin kod Kod adalah seperti berikut:

var langs = ['JavaScript', 'Python', 'Haskell'];
var it = Iterators(langs);
untuk (biar [i, lang] di dalamnya)
          print(i ': ' lang); //Output "0: JavaScript" dsb.

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:

Salin kod Kod adalah seperti berikut:

Julat fungsi(rendah, tinggi){
This.low = rendah;
This.high = 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.

Salin kod Kod adalah seperti berikut:

fungsi RangeIterator(julat){
This.range = julat;
This.current = this.range.low;
}
RangeIterator.prototype.next = function(){
Jika (ini.semasa > julat.tinggi ini)
          baling Hentian Lelaran;
       lain
          kembalikan this.current ;
};

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.

Salin kod Kod adalah seperti berikut:

Range.prototype.__iterator__ = function(){
        kembalikan RangeIterator baharu(ini);
};

Setelah kami melengkapkan lelaran tersuai kami, kami boleh mengulangi pada julat contoh:

Salin kod Kod adalah seperti berikut:

julat var = Julat baharu(3, 5);
untuk (var i dalam julat)
​ print(i); //Output 3, kemudian 4, kemudian 5

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