【问题标题】:understanding the iterator protocol理解迭代器协议
【发布时间】:2018-01-05 22:58:06
【问题描述】:

在注释中指出:

iterable 协议允许 JavaScript 对象定义或自定义 它们的迭代行为,例如在一个 for..of 构造。

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

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

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

【问题讨论】:

  • 属性的可枚举性与迭代器完全无关?最重要的是,属性没有迭代的顺序
  • 迭代器比“列表”更通用。它甚至不需要有长度 - 如果你愿意,它可以是无限的!
  • "在注释中说明" - 什么?在哪里?哪些笔记?

标签: javascript ecmascript-6 iterator


【解决方案1】:

将 Iterable 视为一个接口。您可以放心,实现包含一个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 接口的 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];
        }
    }
}

here 列出了您可以使用 Iterables 做什么的更多示例。

【讨论】:

  • count 应该在迭代器中声明
猜你喜欢
  • 2019-08-15
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
  • 2020-12-11
  • 2017-02-21
  • 1970-01-01
相关资源
最近更新 更多