iterable เหมือนกับ iterator หรือแตกต่างกันหรือไม่?
ดูเหมือนว่าจากข้อมูลจำเพาะ iterable เป็นวัตถุพูดobj
เช่นนั้นobj[Symbol.iterator]
หมายถึงฟังก์ชั่นเพื่อที่เมื่อถูกเรียกกลับวัตถุที่มีnext
วิธีการที่จะกลับ{value: ___, done: ___}
วัตถุ:
function foo() {
let i = 0;
const wah = {
next: function() {
if (i <= 2) return { value: (1 + 2 * i++), done: false }
else return { value: undefined, done: true }
}
};
return wah; // wah is iterator
}
let bar = {} // bar is iterable
bar[Symbol.iterator] = foo;
console.log([...bar]); // [1, 3, 5]
for (a of bar) console.log(a); // 1 3 5 (in three lines)
ดังนั้นในโค้ดข้างต้นbar
คือ iterable และwah
เป็น iterator และ the next()
คือ interface iterator
ดังนั้น iterable และ iterator จึงแตกต่างกัน
อย่างไรก็ตามในตัวอย่างทั่วไปของตัวกำเนิดและตัววนซ้ำ:
function* gen1() {
yield 1;
yield 3;
yield 5;
}
const iter1 = gen1();
console.log([...iter1]); // [1, 3, 5]
for (a of iter1) console.log(a); // nothing
const iter2 = gen1();
for (a of iter2) console.log(a); // 1 3 5 (in three lines)
console.log(iter1[Symbol.iterator]() === iter1); // true
ในกรณีข้างต้นgen1
เป็นตัวกำเนิดและiter1
เป็นตัววนซ้ำและiter1.next()
จะทำงานที่เหมาะสม แต่iter1[Symbol.iterator]
จะให้ฟังก์ชันที่เมื่อเรียกใช้จะให้กลับiter1
ซึ่งเป็นตัววนซ้ำ ดังนั้นiter1
ทั้ง iterable และ iterator ในกรณีนี้คืออะไร?
นอกจากนี้iter1
จะแตกต่างจากตัวอย่างที่ 1 ข้างต้นเนื่องจากการทำซ้ำในตัวอย่างที่ 1 สามารถให้ได้[1, 3, 5]
หลายครั้งตามที่ต้องการใช้[...bar]
ในขณะที่iter1
สามารถทำซ้ำได้ แต่เนื่องจากส่งคืนตัวเองซึ่งเป็นตัววนซ้ำเดียวกันทุกครั้งจะให้เพียง[1, 3, 5]
ครั้งเดียว
ดังนั้นเราจึงสามารถพูดได้ว่าbar
สามารถ[...bar]
ให้ผลลัพธ์ได้กี่ครั้ง[1, 3, 5]
และคำตอบก็คือ และ iterable เหมือนกับ iterator หรือไม่? และคำตอบก็คือพวกมันต่างกัน แต่ก็เหมือนกันเมื่อมันใช้ตัวมันเองเป็นตัววนซ้ำ ถูกต้องไหม
iter1
ทั้ง iterable และ iterator ในกรณีนี้คืออะไร " - ใช่ ตัววนซ้ำพื้นเมืองทั้งหมดสามารถทำซ้ำได้ด้วยการส่งคืนตัวเองเพื่อให้คุณสามารถส่งต่อไปยังสิ่งก่อสร้างที่คาดว่าจะทำซ้ำได้ง่าย