素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: twitter: @javascripter にどうぞ。

range、イテレータ

yield使えない環境でも、下みたいに自分で用意すればできる。

function range(min, max, exclude) {
  return {
    next: exclude ?
    function() {
      if (min < max) return min++;
      throw StopIteration
    }: function() {
      if (min <= max) return min++;
      throw StopIteration;
    },
    __iterator__: function() this
  }
}

for(var i in range(0,10))
  console.log(i); // 0, 1, 2, 3, ... , 10

console.log([i for(i in range(1,5))]); // [1, 2, 3, 4, 5];

var ret = [];
for(var i in range(0,Infinity,true))
  if(i % 7 == 0){
    ret.push(i);
    if(ret.length >= 5) break;
  }
console.log(ret); // [0, 7, 14, 21, 28]