JavaScript Iterables
วัตถุที่ทำซ้ำได้คือวัตถุที่สามารถวนซ้ำได้ด้วยfor..of
.
ในทางเทคนิคแล้ว iterables จะต้องใช้Symbol.iterator
วิธีนี้
วนซ้ำบนสตริง
คุณสามารถใช้การfor..of
วนซ้ำเพื่อวนซ้ำองค์ประกอบของสตริง:
ตัวอย่าง
for (const x of "W3Schools") {
// code block to be executed
}
วนซ้ำบนอาร์เรย์
คุณสามารถใช้for..of
ลูปเพื่อวนซ้ำองค์ประกอบของ Array:
ตัวอย่าง
for (const x of [1,2,3,4,5] {
// code block to be executed
}
JavaScript Iterators
โปรโตคอลiteratorกำหนดวิธีสร้างลำดับของค่าจากอ็อบเจ็กต์
ออบเจ็กต์จะกลายเป็นตัววนซ้ำเมื่อนำnext()
เมธอดไปใช้
next()
เมธอดต้องส่งคืนอ็อบเจ็กต์ที่มีคุณสมบัติสองประการ
:
- ค่า (ค่าถัดไป)
- เสร็จสิ้น (จริงหรือเท็จ)
ค่า | ค่าที่ส่งคืนโดย iterator (ละเว้นได้หาก done เป็นจริง) |
---|---|
เสร็จแล้ว |
จริงหากตัววนซ้ำได้เสร็จสิ้น เป็นเท็จหากตัววนซ้ำสร้างค่าใหม่ |
ทำเองที่บ้านได้
ผลตอบแทนที่ทำซ้ำได้นี้ไม่สิ้นสุด: 10,20,30,40,....
next()
เรียกทุกครั้ง:
ตัวอย่าง
// 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
ปัญหาเกี่ยวกับการทำโฮมเมทซ้ำได้:
ไม่สนับสนุนfor..of
คำสั่ง JavaScript
JavaScript iterable เป็นอ็อบเจ็กต์ที่มีSymbol.iterator
Symbol.iterator
เป็นฟังก์ชันที่คืนค่าnext()
ฟังก์ชัน
iterable สามารถทำซ้ำได้ด้วยรหัส: for (const x of iterable) { }
ตัวอย่าง
// 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};
}
};
}
ตอนนี้คุณสามารถใช้ for..of
for (const num of myNumbers) {
// Any Code Here
}
วิธี Symbol.iterator ถูกเรียกโดยอัตโนมัติโดยfor..of
.
แต่เราสามารถทำได้ "ด้วยตนเอง":
ตัวอย่าง
let iterator = myNumbers[Symbol.iterator]();
while (true) {
const result = iterator.next();
if (result.done) break;
// Any Code Here
}