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