Walaupun mereka bekerja dengan baik bersama -sama, fungsi sebenar mereka boleh menjadi sedikit mengelirukan, jadi mari kita lihat lebih dekat.
mata utama
Di JavaScript, kami selalu mempunyai gelung seperti:
for (var i = 0; i < foo.length; i++) { // 对i执行某些操作 }
for (const i of foo) { // 对i执行某些操作 }
Katakan kita ingin mengetahui sama ada setiap nombor dalam array adalah nombor utama. Kita boleh melakukan ini dengan membuat fungsi yang melakukan ini. Ia mungkin kelihatan seperti ini:
function isPrime(number) { if (number <= 1) { return false; } else if (number === 2) { return true; } for (var i = 2; i < number; i++) { if (number % i === 0) { return false; break; } } return true; }
var possiblePrimes = [73, 6, 90, 19, 15]; var confirmedPrimes = []; for (var i = 0; i < possiblePrimes.length; i++) { if (isPrime(possiblePrimes[i])) { confirmedPrimes.push(possiblePrimes[i]); } } // confirmedPrimes现在是[73, 19]
const possiblePrimes = [73, 6, 90, 19, 15]; const confirmedPrimes = []; for (const i of possiblePrimes){ if ( isPrime(i) ){ confirmedPrimes.push(i); } } // confirmedPrimes现在是[73, 19]
Di sebalik tabir, lelaran ini mengambil kesempatan daripada kaedah simbol baru yang berkilat ES6 (). Kaedah ini bertanggungjawab untuk menerangkan lelaran dan apabila dipanggil, mengembalikan objek JavaScript yang mengandungi nilai seterusnya dalam gelung dan kunci yang dilakukan, yang benar atau palsu bergantung kepada sama ada gelung selesai.
Jika anda berminat dengan terperinci ini, anda boleh membaca postingan blog yang indah ini "Iterators Gonna Iterate" oleh Jake Archibald. Seperti yang kita menggali ke bahagian lain artikel ini: Penjana, ia juga memberi anda idea yang baik tentang apa yang berlaku di belakang tabir.
Penjana (juga dikenali sebagai "Kilang ITER") adalah jenis fungsi JavaScript baru yang digunakan untuk membuat lelaran tertentu. Mereka menyediakan anda dengan cara khas untuk gelung melalui kandungan.
Baiklah, jadi apa maksudnya? Mari kita lihat contoh. Katakan kita mahu fungsi, dan setiap kali kita memanggilnya, kita akan diberikan nombor perdana seterusnya:
for (var i = 0; i < foo.length; i++) { // 对i执行某些操作 }
Jika anda digunakan untuk JavaScript, beberapa perkara ini kelihatan seperti sihir, tetapi ia tidak terlalu buruk dalam realiti. Kami mempunyai asterisk yang pelik selepas fungsi kata kunci, tetapi itu hanya memberitahu JavaScript bahawa kita menentukan penjana.
Satu lagi bahagian pelik ialah kata kunci hasil. Ini sebenarnya apa penjana meludah apabila anda memanggilnya. Ia kira -kira bersamaan dengan kembali, tetapi ia mengekalkan keadaan fungsi dan bukannya mengubah segala -galanya setiap kali ia dipanggil. Ia "ingat" lokasinya semasa runtime, jadi pada masa akan datang anda memanggilnya, ia berterusan dari gangguan.
ini bermakna kita boleh melakukan ini:
for (const i of foo) { // 对i执行某些操作 }
Kemudian, setiap kali kita ingin mendapatkan - anda meneka - nombor perdana seterusnya, kita boleh menghubungi NextPrime:
function isPrime(number) { if (number <= 1) { return false; } else if (number === 2) { return true; } for (var i = 2; i < number; i++) { if (number % i === 0) { return false; break; } } return true; }
Anda juga boleh memanggil NextPrime.Next (), yang berguna apabila penjana anda tidak tak terhingga, kerana ia mengembalikan objek seperti ini:
var possiblePrimes = [73, 6, 90, 19, 15]; var confirmedPrimes = []; for (var i = 0; i < possiblePrimes.length; i++) { if (isPrime(possiblePrimes[i])) { confirmedPrimes.push(possiblePrimes[i]); } } // confirmedPrimes现在是[73, 19]
di sini, kunci yang dilakukan memberitahu anda sama ada fungsi itu telah menyelesaikan tugasnya. Dalam kes kita, fungsi kita tidak pernah berakhir, yang secara teorinya memberi kita semua nombor perdana sehingga tak terhingga (jika kita mempunyai memori komputer yang banyak).
Walaupun ECMAScript 2015 telah selesai dan telah bertahun -tahun, sokongan penyemak imbas untuk ciri -cirinya (terutamanya penjana) jauh dari sempurna. Jika anda benar -benar mahu menggunakan ciri -ciri moden ini dan lain -lain, anda boleh melihat penterjemah seperti Babel dan Traceur yang akan menukar kod ECMAScript 2015 anda ke dalam kod ECMASCRIPT 5.
Terdapat juga banyak editor dalam talian yang menyokong ECMAScript 2015, atau memberi tumpuan khusus kepadanya, terutamanya Regenerator Facebook dan JS Bin. Jika anda hanya mahu bermain dan belajar bagaimana JavaScript ditulis sekarang, ini patut dilihat.
Generator dan Iterator menyediakan banyak fleksibiliti baru untuk pendekatan kami terhadap masalah JavaScript. Iterator membolehkan kami menulis untuk gelung dengan cara yang lebih python, yang bermaksud kod kami kelihatan lebih bersih dan mudah dibaca.
fungsi penjana membolehkan kita menulis fungsi yang ingat di mana mereka terakhir dilihat, dan boleh meneruskan pelaksanaan dari gangguan. Mereka juga boleh menjadi tak terhingga dari segi apa yang sebenarnya mereka ingat, yang sangat mudah dalam beberapa kes.
Sokongan untuk penjana dan iterator ini baik. Mereka disokong dalam nod dan dalam semua pelayar moden, kecuali untuk Internet Explorer. Jika anda perlu menyokong penyemak imbas yang lebih tua, cara terbaik ialah menggunakan penterjemah seperti Babel.
Iterator dan penjana adalah kedua -dua ciri ECMAScript 2015 dan digunakan untuk memproses aliran data. Iterator adalah objek yang membolehkan pengaturcara meleleh melalui semua elemen dalam koleksi. Ia mempunyai kaedah seterusnya () yang mengembalikan item seterusnya dalam urutan. Sebaliknya, penjana adalah fungsi yang boleh berhenti separuh dan kemudian terus dari perhentian. Dalam erti kata lain, penjana kelihatan seperti fungsi, tetapi ia bertindak seperti iterator.
Kata kunci hasil digunakan untuk ECMAScript 2015 Jeda dan memulihkan fungsi penjana (fungsi* atau fungsi penjana warisan). Hasil boleh mengembalikan nilai dari fungsi penjana. Nilai pulangan ini biasanya merupakan objek dengan dua sifat: nilai dan dilakukan. Atribut nilai adalah hasil mengira ungkapan hasil, dan dilakukan adalah nilai boolean yang menunjukkan sama ada penjana telah menghasilkan nilai terakhirnya.
Bagaimana menggunakan penjana untuk pengaturcaraan tak segerak dalam ECMAScript 2015?
Apakah perbezaan antara untuk ... gelung dan untuk ... dalam gelung dalam ECMAScript 2015?
Bagaimana untuk membuat iterator tersuai dalam ECMAScript 2015?
Apakah peranan simbol.iterator dalam ECMAScript 2015?
Sudah tentu, ini adalah contoh mudah fungsi penjana dalam ECMAScript 2015:
for (var i = 0; i < foo.length; i++) { // 对i执行某些操作 }
Dalam contoh ini, fungsi idmaker adalah penjana yang menghasilkan urutan nombor.
Kaedah lemparan () dalam ECMAScript 2015 boleh digunakan dalam penjana untuk memulihkan pelaksanaan fungsi penjana dan membuang kesilapan dari ekspresi hasil. Kaedah lemparan () boleh digunakan untuk mengendalikan kesilapan yang berlaku semasa pelaksanaan fungsi penjana.
adalah nilai boolean yang dikembalikan oleh pengarah dalam ECMAScript 2015. Ia menunjukkan sama ada pengarah mempunyai lebih banyak nilai untuk kembali. Sekiranya dilakukan adalah benar, pengarah telah melebihi urutan urutan lelaran. Jika dilakukan adalah palsu, pemalar masih boleh menghasilkan lebih banyak nilai.
Atas ialah kandungan terperinci Penjana dan Iterator ES6: Panduan Pemaju. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!