Rubyではtimesのような便利なイテレータが揃っています。

[code.high.num]
5.times { |i|
    print i
}

# => 01234

JavaSciptでもTimesがしたい

そこで空のArrayを作ってそれをeachするという方法を思いつきました。

new Array(n)ではn個のundefinedの入った配列を作ることができます。

[code.high.num]
new Array(3);

// => [undefined, undefined, undefined]

JavaScriptでのeachはこちらの記事でまとめてあります。

JavaSriptでeachしてみた|あわあわのブログ

それでは、timesのようなこを試してみます。

[code.high.num]
(new Array(5)).forEach(function(v, i) {
    console.log(i);
});

// =>

一回もeachせず...

undefinedの配列要素はforEachしないようです。

jQueryを使ってみる

jQueryのeachを使ってみると、

[code.high.num]
$.each((new Array(5)), function(i) {
    console.log(i);
});

// => 0
// => 1
// => 2
// => 3
// => 4

これでちゃんと動きました。

こんなかんじでtimesっぽいものが書けました。

forは使わないの?

[code.high.num]
for(var i = 0; i < 5; i++) {
    console.log(i);
}

たしかにこれでも動きます。break;も使えて便利かもしれません。

しかし、JavaScriptのスレッドが発生した時、変数iが書き換わり予期しない繰り返し回数になってしまうことがあります。

JavaScriptにおいてスレッドが発生する時はeventsetTimeoutです。

このような場面でイテレータ内の操作に多少の遅延などがあった場合、forの処理中にforが行われてしまい、変数iが書き換わってしまいます。

予期しないバグが発生するかもしれません。

それと、私はtimesっぽく書きたいのでやっぱりforはなしですね。



blog comments powered by Disqus

Published

20 April 2013

Tags