JavaScriptでtimesっぽいことをしてみた
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はこちらの記事でまとめてあります。
それでは、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においてスレッドが発生する時はeventとsetTimeoutです。
このような場面でイテレータ内の操作に多少の遅延などがあった場合、forの処理中にforが行われてしまい、変数iが書き換わってしまいます。
予期しないバグが発生するかもしれません。
それと、私はtimesっぽく書きたいのでやっぱりforはなしですね。
blog comments powered by Disqus