cari
Rumahhujung hadapan webtutorial jsPenjelasan 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():

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

Apabila fungsi penjana dipanggil, badan fungsi tidak akan dilaksanakan serta-merta, ia akan mengembalikan objek lelaran penjana. Setiap kali kaedah next() bagi penjana-iterator dipanggil, badan fungsi akan melaksanakan kepada ungkapan hasil seterusnya dan kemudian mengembalikan hasilnya. Apabila fungsi tamat atau kenyataan pulangan ditemui, pengecualian StopIteration dilemparkan.

Gunakan contoh untuk menerangkan dengan lebih baik:

Salin kod Kod adalah seperti berikut:

function simpleGenerator(){
menghasilkan "dahulu";
         hasil "kedua";
         menghasilkan "ketiga";
untuk (var i = 0; i           hasil i;
}
 
var g = simpleGenerator();
Print(g.next()); //Output "first"
Print(g.next()); //Output "second"
Print(g.next()); //Output "third"
Print(g.next()); //Output 0
Print(g.next()); //Output 1
Print(g.next()); //Output 2
Print(g.next()); //Throw StopIteration exception

Fungsi penjana boleh digunakan secara langsung sebagai kaedah __iterator__ oleh kelas, yang boleh mengurangkan jumlah kod yang memerlukan iterator tersuai dengan berkesan. Mari tulis semula Julat menggunakan penjana:

Salin kod Kod adalah seperti berikut:

Julat fungsi(rendah, tinggi){
This.low = rendah;
This.high = tinggi;
}
Range.prototype.__iterator__ = function(){
untuk (var i = this.low; i           hasil i;
};
julat var = Julat baharu(3, 5);
untuk (var i dalam julat)
​ print(i); //Output 3, kemudian 4, kemudian 5

Tidak semua penjana ditamatkan, anda boleh mencipta penjana yang mewakili urutan tak terhingga. Penjana berikut melaksanakan jujukan Fibonacci, di mana setiap elemen ialah hasil tambah dua sebelumnya:

Salin kod Kod adalah seperti berikut:

fungsi fibonacci(){
var fn1 = 1;
var fn2 = 1;
manakala (1) {
        var semasa = fn2;
           fn2 = fn1;
             fn1 = arus fn1;
                        hasil semasa;
}
}
 
jujukan var = fibonacci();
Print(sequence.next()); // 1
Print(sequence.next()); // 1
Print(sequence.next()); // 2
Print(sequence.next()); // 3
Print(sequence.next()); // 5
Print(sequence.next()); // 8
Print(sequence.next()); // 13

Generatorfunktionen können Parameter annehmen, und diese Parameter werden beim ersten Aufruf der Funktion verwendet. Mit der return-Anweisung kann ein Generator beendet werden (was dazu führt, dass er eine StopIteration-Ausnahme auslöst). Die folgende Variante von fibonacci() verwendet ein optionales Limit-Argument, das die Funktion beendet, wenn eine Bedingung ausgelöst wird.

Code kopieren Der Code lautet wie folgt:

Funktion fibonacci(limit){
var fn1 = 1;
var fn2 = 1;
while(1){
        var current = fn2;
           fn2 = fn1;
             fn1 = fn1 aktuell;
Wenn (Limit && aktuelles > Limit)
           zurück;
                        Ertrag aktuell;
}
}

Erweiterte Generatorfunktionen

Der Generator kann den Yield-Return-Wert bei Bedarf berechnen, was es ermöglicht, zuvor teure Sequenzberechnungsanforderungen darzustellen, sogar unendliche Sequenzen, wie oben gezeigt.

Zusätzlich zur next()-Methode verfügt das Generator-Iterator-Objekt auch über eine send()-Methode, die den internen Status des Generators ändern kann. Der an send() übergebene Wert wird als Ergebnis des letzten Yield-Ausdrucks behandelt und der Generator wird angehalten. Bevor Sie die send()-Methode verwenden, um einen bestimmten Wert zu übergeben, müssen Sie next() mindestens einmal aufrufen, um den Generator zu starten.

Der folgende Fibonacci-Generator verwendet die send()-Methode, um die Sequenz neu zu starten:

Code kopieren Der Code lautet wie folgt:

Funktion fibonacci(){
var fn1 = 1;
var fn2 = 1;
während (1) {
        var current = fn2;
           fn2 = fn1;
             fn1 = fn1 aktuell;
      var reset = Ertragsstrom;
          if (zurücksetzen) {
              fn1 = 1;
              fn2 = 1;
}
}
}
 
var sequence = fibonacci();
Print(sequence.next()); //1
Print(sequence.next()); //1
Print(sequence.next()); //2
Print(sequence.next()); //3
Print(sequence.next()); //5
Print(sequence.next()); //8
Print(sequence.next()); //13
Print(sequence.send(true)); //1
Print(sequence.next()); //1
Print(sequence.next()); //2
Print(sequence.next()); //3

Hinweis: Ein interessanter Punkt ist, dass der Aufruf von send(undefiniert) genau das Gleiche ist wie der Aufruf von next(). Wenn jedoch die Methode send() aufgerufen wird, um einen neuen Generator zu starten, löst jeder andere Wert als undefiniert eine TypeError-Ausnahme aus.

Sie können einen Generator dazu zwingen, eine Ausnahme auszulösen, indem Sie die Methode throw aufrufen und einen Ausnahmewert übergeben, den er auslösen soll. Diese Ausnahme wird aus dem aktuellen Kontext ausgelöst und hält den Generator an, ähnlich der aktuellen Yield-Ausführung, mit der Ausnahme, dass sie durch eine Throw-Value-Anweisung ersetzt wird.

Wenn Yield während der Behandlung einer ausgelösten Ausnahme nicht auftritt, wird die Ausnahme weitergegeben, bis die Methode throw() aufgerufen wird, und nachfolgende Aufrufe von next() führen dazu, dass die StopIteration-Ausnahme ausgelöst wird.

Generatoren verfügen über eine close()-Methode, um das Beenden des Generators zu erzwingen. Das Beenden eines Generators hat folgende Auswirkungen:

1. Alle gültigen Final-Klauseln im Generator werden ausgeführt
2. Wenn die final-Klausel eine andere Ausnahme als StopIteration auslöst, wird die Ausnahme an den Aufrufer der close()-Methode
übergeben 3. Der Generator wird beendet

Generatorausdruck

Ein offensichtlicher Nachteil von Array-Comprehensions besteht darin, dass sie dazu führen, dass das gesamte Array im Speicher erstellt wird. Der Mehraufwand ist trivial, wenn die Eingabe für das Verständnis ein kleines Array ist – es können jedoch Probleme auftreten, wenn das Eingabearray groß ist oder wenn ein neuer teurer (oder unendlicher) Array-Generator erstellt wird.

Generatoren ermöglichen die verzögerte Berechnung von Sequenzen und berechnen Elemente bei Bedarf nach Bedarf. Ein Generatorausdruck ist syntaktisch fast dasselbe wie ein Array-Verständnis – er verwendet Klammern anstelle von eckigen Klammern (und for...in statt for every...in) –, erstellt jedoch einen Generator anstelle eines Arrays, sodass Sie dies können die Berechnung verzögern. Sie können es sich als eine kurze Syntax zum Erstellen von Generatoren vorstellen.

Angenommen, wir haben einen Iterator, der eine große Folge von ganzen Zahlen durchläuft. Wir müssen einen neuen Iterator erstellen, um über gerade Zahlen zu iterieren. Ein Array-Verständnis erstellt ein vollständiges Array aller geraden Zahlen im Speicher:

Code kopieren Der Code lautet wie folgt:

var doubles = [i * 2 for (i in it)];

Der Generatorausdruck erstellt einen neuen Iterator und berechnet bei Bedarf bei Bedarf gerade Werte:

Code kopieren Der Code lautet wie folgt:

var it2 = (i * 2 for (i in it));
Print(it2.next()); //Die erste gerade Zahl darin
Print(it2.next()); //Die zweite gerade Zahl darin

Wenn ein Generator als Funktionsargument verwendet wird, werden für Funktionsaufrufe Klammern verwendet, d. h. die äußersten Klammern können weggelassen werden:

Code kopieren Der Code lautet wie folgt:

var result = doSomething(i * 2 for (i in it));

Ende.

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Beyond the Browser: JavaScript di dunia nyataBeyond the Browser: JavaScript di dunia nyataApr 12, 2025 am 12:06 AM

Aplikasi JavaScript di dunia nyata termasuk pengaturcaraan sisi pelayan, pembangunan aplikasi mudah alih dan Internet of Things Control: 1. Pengaturcaraan sisi pelayan direalisasikan melalui node.js, sesuai untuk pemprosesan permintaan serentak yang tinggi. 2. Pembangunan aplikasi mudah alih dijalankan melalui reaktnatif dan menyokong penggunaan silang platform. 3. Digunakan untuk kawalan peranti IoT melalui Perpustakaan Johnny-Five, sesuai untuk interaksi perkakasan.

Membina aplikasi SaaS Multi-penyewa dengan Next.js (Integrasi Backend)Membina aplikasi SaaS Multi-penyewa dengan Next.js (Integrasi Backend)Apr 11, 2025 am 08:23 AM

Saya membina aplikasi SaaS multi-penyewa berfungsi (aplikasi edTech) dengan alat teknologi harian anda dan anda boleh melakukan perkara yang sama. Pertama, apakah aplikasi SaaS multi-penyewa? Aplikasi SaaS Multi-penyewa membolehkan anda melayani beberapa pelanggan dari Sing

Cara Membina Aplikasi SaaS Multi-Tenant dengan Next.js (Integrasi Frontend)Cara Membina Aplikasi SaaS Multi-Tenant dengan Next.js (Integrasi Frontend)Apr 11, 2025 am 08:22 AM

Artikel ini menunjukkan integrasi frontend dengan backend yang dijamin oleh permit, membina aplikasi edtech SaaS yang berfungsi menggunakan Next.Js. Frontend mengambil kebenaran pengguna untuk mengawal penglihatan UI dan memastikan permintaan API mematuhi dasar peranan

JavaScript: meneroka serba boleh bahasa webJavaScript: meneroka serba boleh bahasa webApr 11, 2025 am 12:01 AM

JavaScript adalah bahasa utama pembangunan web moden dan digunakan secara meluas untuk kepelbagaian dan fleksibiliti. 1) Pembangunan front-end: Membina laman web dinamik dan aplikasi satu halaman melalui operasi DOM dan kerangka moden (seperti React, Vue.js, sudut). 2) Pembangunan sisi pelayan: Node.js menggunakan model I/O yang tidak menyekat untuk mengendalikan aplikasi konkurensi tinggi dan masa nyata. 3) Pembangunan aplikasi mudah alih dan desktop: Pembangunan silang platform direalisasikan melalui reaktnatif dan elektron untuk meningkatkan kecekapan pembangunan.

Evolusi JavaScript: Trend Semasa dan Prospek Masa DepanEvolusi JavaScript: Trend Semasa dan Prospek Masa DepanApr 10, 2025 am 09:33 AM

Trend terkini dalam JavaScript termasuk kebangkitan TypeScript, populariti kerangka dan perpustakaan moden, dan penerapan webassembly. Prospek masa depan meliputi sistem jenis yang lebih berkuasa, pembangunan JavaScript, pengembangan kecerdasan buatan dan pembelajaran mesin, dan potensi pengkomputeran IoT dan kelebihan.

Demystifying JavaScript: Apa yang berlaku dan mengapa pentingDemystifying JavaScript: Apa yang berlaku dan mengapa pentingApr 09, 2025 am 12:07 AM

JavaScript adalah asas kepada pembangunan web moden, dan fungsi utamanya termasuk pengaturcaraan yang didorong oleh peristiwa, penjanaan kandungan dinamik dan pengaturcaraan tak segerak. 1) Pengaturcaraan yang didorong oleh peristiwa membolehkan laman web berubah secara dinamik mengikut operasi pengguna. 2) Penjanaan kandungan dinamik membolehkan kandungan halaman diselaraskan mengikut syarat. 3) Pengaturcaraan Asynchronous memastikan bahawa antara muka pengguna tidak disekat. JavaScript digunakan secara meluas dalam interaksi web, aplikasi satu halaman dan pembangunan sisi pelayan, sangat meningkatkan fleksibiliti pengalaman pengguna dan pembangunan silang platform.

Adakah Python atau JavaScript lebih baik?Adakah Python atau JavaScript lebih baik?Apr 06, 2025 am 12:14 AM

Python lebih sesuai untuk sains data dan pembelajaran mesin, manakala JavaScript lebih sesuai untuk pembangunan front-end dan penuh. 1. Python terkenal dengan sintaks ringkas dan ekosistem perpustakaan yang kaya, dan sesuai untuk analisis data dan pembangunan web. 2. JavaScript adalah teras pembangunan front-end. Node.js menyokong pengaturcaraan sisi pelayan dan sesuai untuk pembangunan stack penuh.

Bagaimana saya memasang javascript?Bagaimana saya memasang javascript?Apr 05, 2025 am 12:16 AM

JavaScript tidak memerlukan pemasangan kerana ia sudah dibina dalam pelayar moden. Anda hanya memerlukan editor teks dan penyemak imbas untuk memulakan. 1) Dalam persekitaran penyemak imbas, jalankan dengan memasukkan fail HTML melalui tag. 2) Dalam persekitaran Node.js, selepas memuat turun dan memasang node.js, jalankan fail JavaScript melalui baris arahan.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

mPDF

mPDF

mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft