Skip to content

0x01f-es6中迭代器的使用2

接上文 [0x018-es6中迭代器的使用1]

观察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() 方法。

额外:Generator中的this指向问题 (TODO)