Generator函数

Generator函数

1
2
3
4
function* foo() {
yield 1;
yield 2;
}
  • generator函数返回Itorator对象

yield 和 return

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function* foo() {
yield 1;
yield 2;
}
let f = foo()
f.next() //{value: 1, done: false}
f.next() //{value: 2, done: false}
f.next() //{value: undefined, done: true}
function* foo1() {
yield 1;
return 2;
}
let f1 = foo1()
f1.next() //{value: 1, done: false}
f1.next() //{value: 2, done: true}
f1.next() //{value: undefined, done: true}
  • yield 返回的done状态为false
  • return 返回的done状态为true,并不执行return后面的语句

for…of 循环

1
2
3
4
5
6
7
8
9
10
11
function* foo() {
yield 1;
yield 2;
yield 3;
return 4;
}
for(let value of foo()) {
console.log(value)
}
// 1 2 3
  • 一旦next方法的返回对象的done属性为true,for…of循环就会中止,且不包含该返回对象,所以上面代码的return语句返回的6,不包括在for…of循环之中。
  • 扩展运算符(…)、解构赋值和Array.from方法内部调用的,都是遍历器接口。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    function* numbers () {
    yield 1
    yield 2
    return 3
    yield 4
    }
    // 扩展运算符
    [...numbers()] // [1, 2]
    // Array.from 方法
    Array.from(numbers()) // [1, 2]
    // 解构赋值
    let [x, y] = numbers();
    x // 1
    y // 2
    // for...of 循环
    for (let n of numbers()) {
    console.log(n)
    }
    // 1
    // 2