观察forof
ES6 规定,默认的 Iterator 接口部署在数据结构的Symbol.iterator
属性。例如:
js
// 示例1:
let arr = ['a', 'b', 'c'];
let iter = arr[Symbol.iterator]();
console.log(iter.next()); // Object {value: "a", done: false}
console.log(iter.next()); // Object {value: "b", done: false}
console.log(iter.next()); // Object {value: "c", done: false}
console.log(iter.next()); // Object {value: undefined, done: true}
// 示例2:
let arr = ['a', 'b', 'c'];
let iter = arr[Symbol.iterator]();
for (const item of iter) {
console.log(item);
}
// a
// b
// c
// 示例3:
let arr = ['a', 'b', 'c'];
for (const item of arr) {
console.log(item);
}
// a
// b
// c
// 示例4:
function *makeIterator() {
yield 'a'
yield 'b'
yield 'c'
}
const it = makeIterator()
for (const item of it) {
console.log(item);
}
// a
// b
// c
// 示例1:
let arr = ['a', 'b', 'c'];
let iter = arr[Symbol.iterator]();
console.log(iter.next()); // Object {value: "a", done: false}
console.log(iter.next()); // Object {value: "b", done: false}
console.log(iter.next()); // Object {value: "c", done: false}
console.log(iter.next()); // Object {value: undefined, done: true}
// 示例2:
let arr = ['a', 'b', 'c'];
let iter = arr[Symbol.iterator]();
for (const item of iter) {
console.log(item);
}
// a
// b
// c
// 示例3:
let arr = ['a', 'b', 'c'];
for (const item of arr) {
console.log(item);
}
// a
// b
// c
// 示例4:
function *makeIterator() {
yield 'a'
yield 'b'
yield 'c'
}
const it = makeIterator()
for (const item of it) {
console.log(item);
}
// a
// b
// c
通过对比,可以发现:
forof
遍历数组,不会遍历到done=true
forof
可以遍历迭代器(示例2),这种行为和示例4类似。
forof
首先调用可迭代对象的 [Symbol.iterator]()
](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator) 方法,该方法返回一个迭代器,然后重复调用生成器的 next()
方法。