ECMAScript 6(ES6) 特性概览和与ES5的比较14(上)-生成器Generators

1.生成器函数,迭代协议

支持生成器,包含生成器函数的迭代器的特殊情况,其中控制流可以暂停和恢复,以便生成值序列(有限或无限)。

ECMAScript 6

let fibonacci = {
    *[Symbol.iterrator]() {
        let pre = 0, cur = 1
        for (;;) {
            [ pre, cur ] = [ cur, pre + cur]
            yeild cur
        }
    }
}

for (let n of fibonacci) {
    if (n > 1000)
        break
    console.log(n)
}

ECMAScript 5

var fibonacci = {
    next: (function () {
        var pre = 0, cur = 1;
        return function () {
            tmp = pre;
            pre = cur;
            cur += tmp;
            return cur;
        };
    })()
};

var n;
for (;;) {
    n = fibonacci.next();
    if (n > 1000)
        break;
    console.log(n);
}

2.直接使用生成器函数

支持生成器函数,这是一种特殊的函数变体,可以暂停和恢复控制流,以生成值序列(有限或无限)。

ECMAScript 6

function* range (start, end, step) {
    while (start < end) {
        yield start
        start += step
    }
}

for (let i of range(0, 10, 2)) {
    console.log(i)
}

ECMAScript 5

function range (start, end, step) {
    var list = [];
    while (start < end) {
        list.push(start);
        start += step;
    }
    return list;
}

var r = range(0, 10, 2);
for (var i = 0; i < r.length; i++) {
    console.log(r[i]);
}

3.生成器匹配

支持生成器功能,即可以暂停和恢复控制流的功能,以便产生和扩展值序列(有限或无限)。

ECMAScript 6

let fibonacci = function* (numbers) {
    let pre = 0, cur = 1
    while (numbers-- >0) {
        [ pre, cur ] = [ cur, pre + cur ]
        yield cur
    }
}

for (let n of fibonacci(1000))
    console.log(n)

let numbers = [ ...fibonacci(1000) ]

let [ n1, n2, n3, ...others ] = fibonacci(1000)

ECMAScript 5

//ES5中没有相关表达

猜你喜欢

转载自blog.csdn.net/u010622874/article/details/84035870