JavaScript Iterable
Objek yang dapat diubah adalah objek yang dapat diulang dengan for..of
.
Secara teknis, iterables harus mengimplementasikan Symbol.iterator
metode.
Mengulangi Sebuah String
Anda dapat menggunakan for..of
loop untuk mengulangi elemen string:
Contoh
for (const x of "W3Schools") {
// code block to be executed
}
Mengulangi Array
Anda dapat menggunakan for..of
loop untuk mengulangi elemen-elemen Array:
Contoh
for (const x of [1,2,3,4,5] {
// code block to be executed
}
Iterator JavaScript
Protokol iterator mendefinisikan bagaimana menghasilkan urutan nilai dari suatu objek.
Sebuah objek menjadi iterator ketika mengimplementasikan sebuah next()
metode.
Metode next()
harus mengembalikan objek dengan dua properti:
- nilai (nilai berikutnya)
- dilakukan (benar atau salah)
nilai | Nilai yang dikembalikan oleh iterator (Dapat dihilangkan jika dilakukan benar) |
---|---|
selesai |
benar jika iterator telah menyelesaikan salah jika iterator telah menghasilkan nilai baru |
Buatan Rumah Iterable
Pengembalian yang dapat diulang ini tidak pernah berakhir: 10,20,30,40,.... Setiap kali
next()
disebut:
Contoh
// Home Made Iterable
function myNumbers() {
let n = 0;
return {
next: function() {
n += 10;
return {value:n, done:false};
}
};
}
// Create Iterable
const n = myNumbers();
n.next(); // Returns 10
n.next(); // Returns 20
n.next(); // Returns 30
Masalah dengan home made iterable:
Itu tidak mendukung for..of
pernyataan JavaScript.
Iterable JavaScript adalah objek yang memiliki Symbol.iterator .
The Symbol.iterator
adalah fungsi yang mengembalikan next()
fungsi.
Iterable dapat diulang dengan kode:for (const x of iterable) { }
Contoh
// Create an Object
myNumbers = {};
// Make it Iterable
myNumbers[Symbol.iterator] = function() {
let n = 0;
done = false;
return {
next() {
n += 10;
if (n == 100) {done = true}
return {value:n, done:done};
}
};
}
Sekarang Anda dapat menggunakanfor..of
for (const num of myNumbers) {
// Any Code Here
}
Metode Symbol.iterator dipanggil secara otomatis oleh for..of
.
Tapi kita juga bisa melakukannya "secara manual":
Contoh
let iterator = myNumbers[Symbol.iterator]();
while (true) {
const result = iterator.next();
if (result.done) break;
// Any Code Here
}