javascript - 理解迭代器协议(protocol)

标签 javascript ecmascript-6 iterator

在注释中指出:

The iterable protocol allows JavaScript objects to define or customize their iteration behavior, such as what values are looped over in a for..of construct.

当我已经可以使用 Object.degineProperty 来使某些内容可枚举时,我看不出这有什么好处。

function withValue(value) {
       var d = withValue.d || (
           withValue.d = {
               enumerable: false,
               writeable: false,
               configuration: false,
               value: null
          }
      )
    // other code;
   }

这些协议(protocol)有什么好处?如果这只是一些新的语法来安抚新的 for...of 循环,那么除了简单地检查长度并查看“列表”中的项目是否用完之外,它还有什么好处。

最佳答案

将 Iterable 视为一个接口(interface)。您可以放心,实现包含 Symbol.iterator 属性,该属性实现 next() 方法。如果您自己实现,则可以生成要在运行时迭代的值。作为一个简单的示例,生成一个列表,然后决定要迭代多少个(或哪个,或任何标准):

function List (...args) {
    this.getOnly = function (limit) (
        const effectiveLimit = Math.min(args.length, limit + 1);
        const iterable = {
            [Symbol.iterator]() {
                let count = 0;
                const iterator = {
                    next() {
                        if (count < effectiveLimit) {
                            return { value: args[count++] };
                        } else {
                            return { done: true };
                        }
                    }
                };
                return iterator;
            }
        }
        return iterable;
    };
}

const list = List(0, 1, 2, 3, 4);
for (const x of list.getOnly(3)) {
    console.log(x);
}
// returns 0, 1, 2

如果您使用实现 Iterable 接口(interface)的 Generator 函数,那么事情就会变得非常简单:

function List (...args) {
    this.getOnly = function* (limit) {
        const effectiveLimit = Math.min(args.length, limit + 1);
        for (let count = 0; count < effectiveLimit; count++) {
            yield args[count];
        }
    }
}

列出了有关可使用 Iterables 执行的更多示例 here .

关于javascript - 理解迭代器协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45397780/

相关文章:

c++ - 返回 const 和非常量包装对象

JavaScript Image().width 返回 0

javascript - 如何将我的 leaflet.draw 单位从英制更改为公制?

javascript - 如何让 PhpStorm 支持这种语法

javascript - 为什么在JavaScript中对象不可迭代?

python - 在 Python 中按排序顺序从排序的迭代器中产生?

c++ - 从 C++ vector 中推送和检索值的意外输出

javascript - graphql 枚举未在架构中定义

javascript - 如何逐步为 6 个盒子制作动画?

javascript - JSON 中的 Jquery 函数