Javascript ES6 Iterator协议和forEach

时间:2017-11-10 21:22:57

标签: javascript ecmascript-6 iterator

目前我正在提高我的ES6技能。我正在研究迭代器/生成器语法。我有一个

的工作示例

class Library {
    constructor(){
        this._books = [];
    }
    addBook(book){
        this._books.push(book);
    }
    get books() {
        return this._books;
    }
    *[Symbol.iterator]() {
        for(let i=0; i<this._books.length; i++) {
            yield this._books[i];
        }
    }
}

l = new Library();
l.addBook("Book1");
l.addBook("Book2");

for(let book of l){
    console.log(book);
}

一切正常。但我的第一种方法是尝试像

这样的东西
*[Symbol.iterator]() {
    this._books.forEach(
        book => yield book
    )
}

哪个(显然)不正确。除了使用forwhile更简洁的方式进行循环之外,还有这个吗?

3 个答案:

答案 0 :(得分:3)

我会使用yield*

    *[Symbol.iterator]() {
        yield* this._books;
    }

答案 1 :(得分:2)

我认为以下是最惯用的方法。请参考trincot的答案。

*[Symbol.iterator]() {
    for(let book of this._books) {
        yield book;
    }
}

答案 2 :(得分:1)

如果你真的通过迭代器,你也可以

[Symbol.iterator]() {
  return this._books[Symbol.iterator]();
}

并且首先跳过需要生成器。