JS中数字原型的自定义迭代器

Ant*_*ier 2 javascript iterator for-loop prototype

最近,我了解了JS迭代器,它在for( of )循环中使用。由于在JS中甚至原始函数都具有原型,因此我想知道是否可以扩展Number原型,从而使以下内容成为有效的表达式:

for(let i of 10) console.log(i); //0 1 2 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)

显然,这仅适用于整数,但是有没有办法实现呢?

希望有,但是由于我是JS的这一部分的新手,所以我无法自己创建它。

Cer*_*nce 5

当然,只需定义Number.prototype[Symbol.iterator]

Number.prototype[Symbol.iterator] = function() {
  let currentNum = 0;
  return {
    next: () => (
      currentNum == this
      ? { done: true }
      : {
        value: currentNum++,
        done: false
      }
    )
  }
}
for (const i of 10) console.log(i);
Run Code Online (Sandbox Code Playgroud)

但是改变内置对象(如 global Number)是非常糟糕的做法 - 如果可能的话,最好找到另一种方法来完成您想要完成的任何事情。


Nin*_*olz 5

您可以将Generatorfor Symbol.iterator作为原型Number

Number.prototype[Symbol.iterator] = function* () {
    for (var i = 0; i < this; i++) {
        yield i;
    }
};

console.log([...10]);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)