Là một iterable giống như một iterator, hay chúng khác nhau?
Dường như, từ các đặc tả , một iterable là một đối tượng, giả sử, obj
có obj[Symbol.iterator]
nghĩa là tham chiếu đến một hàm, để khi được gọi, trả về một đối tượng có một next
phương thức có thể trả về một {value: ___, done: ___}
đối tượng:
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)
Vì vậy, trong đoạn mã trên, bar
là iterable, và wah
là iterator, và next()
là giao diện iterator.
Vì vậy, iterable và iterator là những thứ khác nhau.
Tuy nhiên, bây giờ, trong một ví dụ phổ biến về trình tạo và trình lặp:
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
Trong trường hợp trên, gen1
là trình tạo, và iter1
là trình vòng lặp, và iter1.next()
sẽ thực hiện công việc thích hợp. Nhưng iter1[Symbol.iterator]
không đưa ra một chức năng mà khi được gọi sẽ trả lại iter1
, đó là một trình vòng lặp. Vì vậy, iter1
cả hai là một iterable và iterator trong trường hợp này?
Bên cạnh đó, iter1
khác với ví dụ 1 ở trên, bởi vì iterable trong ví dụ 1 có thể cung cấp [1, 3, 5]
bao nhiêu lần bạn muốn sử dụng [...bar]
, trong khi đó iter1
là một lần lặp, nhưng vì nó trả về chính nó, là cùng một trình lặp mỗi lần, sẽ chỉ cung cấp [1, 3, 5]
một lần.
Vì vậy, chúng ta có thể nói, đối với một lần lặp bar
, bao nhiêu lần có thể [...bar]
cho kết quả [1, 3, 5]
- và câu trả lời là, nó phụ thuộc. Và iterable có giống như iterator không? Và câu trả lời là, chúng là những thứ khác nhau, nhưng chúng có thể giống nhau, khi iterable sử dụng chính nó như là iterator. Đúng không?
iter1
cả hai là một iterable và iterator trong trường hợp này? " - có. Tất cả các trình vòng lặp gốc cũng có thể lặp lại bằng cách tự quay trở lại, để bạn có thể dễ dàng chuyển chúng vào các cấu trúc mong đợi một lần lặp.