配列初期化問題

詰まった事.

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));

はやく全ての処理系でリスト内包使えるようにならないかな.