在 JavaScript 中,可迭代对象是否应该重复迭代?

nop*_*ole 8 javascript iterable ecmascript-6

我发现一些迭代可以重复迭代:

const iterable = {
  [Symbol.iterator]: function* () {
    yield 1;
    yield 3;
    yield 5;
  }
}

console.log([...iterable]);
console.log([...iterable]);
console.log([...iterable]);
Run Code Online (Sandbox Code Playgroud)

虽然有些不能:

function* generatorFn() {
  yield 1;
  yield 3;
  yield 5;
}

const iterable = generatorFn();

console.log([...iterable]);
console.log([...iterable]);
console.log([...iterable]);
Run Code Online (Sandbox Code Playgroud)

是否有一个可迭代对象是否应该重复迭代的规则?

我理解为什么它们的行为不同(这是因为第二种情况,当iterable[Symbol.iterator]调用函数时,返回相同的迭代器(它iterable本身。可以尝试iterable[Symbol.iterator]() === iterable,它也会返回trueiterable.next也是一个函数。所以在这种情况下,iterable是一个生成器object、iterable 和 iterator,所有三个)。但我想知道 iterable 作为对象类型,是否有明确定义的行为是否应该或不应该重复迭代。)

Nin*_*olz 1

iterableofconst iterable = generatorFn();也是一个可迭代Generator对象,也是一个对象。

该对象由生成器函数Generator返回,并且它同时符合可迭代协议迭代器协议

该生成器遵循协议并且仅与可迭代对象一起运行一次。

  • Mozilla 区分生成器函数和生成器对象(或只是生成器)。我认为生成器也是可迭代的,否则“[...iterable]”将无法工作。如果它像鸭子一样嘎嘎叫,那么它就是鸭子。(或者至少是可以嘎嘎叫的) (2认同)