配列初期化問題
詰まった事.
javascriptで配列を初期化するとき,こう書いた.
// 実行環境 : v8 console // 長さ10の配列を全て整数10で初期化する var array = (new Array (10)).map (function (elem) { return 10;}); print (array); ,,,,,,,,,
うまくいかない.
そこで内部仕様をみてみる.
print ((new Array (0)).map); function map(f, receiver) { if (!(typeof(f) === 'function')) { throw MakeTypeError('called_non_callable', [ f ]); } var length = this.length; var result = new $Array(length); for (var i = 0; i < length; i++) { var current = this[i]; if (!(typeof(current) === 'undefined') || i in this) { result[i] = f.call(receiver, current, i, this); } } return result; }
なるほど.要素が'undefnied'型の場合は何もしないわけか.
そりゃそうだ,本来なら,その値が関数呼び出しの引数になるわけだから.
というわけで,map,filter,forEachメソッドは全部そんな感じだろう.気をつけなければいけない.
正解はこんな感じか.
var array = (function (array) { for (var i = 0; i < 10; i++) { array[i] = 10; } return array; } (new Array (10));
はやく全ての処理系でリスト内包使えるようにならないかな.