【问题标题】:Can I make an iterator with a simple function? (No generator or Symbol.iterator)我可以用一个简单的函数制作一个迭代器吗? (没有生成器或 Symbol.iterator)
【发布时间】:2018-11-27 18:54:52
【问题描述】:

我一直在尝试使用普通函数制作迭代器,不使用生成器或将Symbol.iterator 协议用于学术目的。为此,我创建了一个函数,它返回一个带有 next 参数的对象,但尝试将其作为 for...of 循环的 iterable 参数运行会产生不需要的结果。

这是我目前的代码,我从Iterators and Generators page on MDN复制过来的:

function iterateThis(arr){
    let i = 0;
    return {
        next: function() {
            return i < arr.length ?
                {value: arr[i++], done: false} :
                {done: true};
        }
     };
}

如果我尝试像这样运行它:

const iterable = iterateThis([1,2,3,4,5]);
for(item in iterable){
    console.log(item);
}

在控制台上,我只得到一个结果:next。

我在创建函数iterateThis 时做错了什么吗?还是for...of 仅设计用于生成器和Symbol.iterator 属性?

在节点 v8.11.1 上执行

【问题讨论】:

  • 迭代器对象使用特殊结构构建,允许使用for-in 对其进行迭代。如果您不通过迭代器公共符号应用迭代器逻辑,我看不出如何在任何级别上复制效果。它超出了本机功能。

标签: javascript iterator iterable


【解决方案1】:

问题是您的iterateThis 函数返回一个迭代器,但for/of 构造需要一个可迭代。

好的,等等,有什么区别?

来自MDN's page on iteration protocols:

为了可迭代,对象必须实现@@iterator 方法,意味着对象(或对象之一) 原型链)必须有一个带有@@iterator 键的属性,即 可通过常量Symbol.iterator:

另一方面:

当对象实现next() 方法时,它就是一个迭代器 以下语义:由于长度而被省略,TL;DR:下一个方法 返回形式的对象:{value: T, done: boolean}

它们是相关的,因为调用 iterable 的 @@iterator 方法会返回一个 iterator。

for/of 循环总是需要一个可迭代的,所以如果你想使用for/of,你必须使用@@iterator/Symbol.iterator。据我所知,没有办法绕过它。但是您的 sn-p 可以很容易地修改为使用它,只需创建一个对象,该对象在调用 Symbol.iterator 方法时返回您的迭代器:

function iterateThis(arr){
    let i = 0;
    return {
        next: function() {
            return i < arr.length ?
                {value: arr[i++], done: false} :
                {done: true};
        }
     };
}

function makeIterableFromIterator(iterator) {
  return {
    [Symbol.iterator]: function() {
      return iterator;
    }
  }
}

const iterator = iterateThis([1, 2, 3, 4, 5]);
const iterable = makeIterableFromIterator(iterator);

for (item of iterable) {
  console.log(item);
}

【讨论】:

    猜你喜欢
    • 2021-05-23
    • 2019-03-18
    • 1970-01-01
    • 2023-03-24
    • 2020-10-06
    • 2020-10-09
    • 1970-01-01
    • 2020-10-27
    • 2021-01-11
    相关资源
    最近更新 更多