恐らくIEではmapやfilter, forEachはまだ使えないのかな.

windowsが無いに等しいので知る術がないのですが...



それはおいといて,配列を初期化するときこう書く.多分,普通.

var array = new Array (3);
for (var i = 0; i < array.length; i++) {
    array[i] = "init";
}

David Flanagan著オライリー刊"JavaScript"にもこんな風に書けと書かれている.

まぁそれはそれで良いのだが,こう書きたい.

var array = (new Array (3)).map (function () {
    return "init";
});

これが書ければ,エレガントだ.意味も分かりやすい(lisperには).

が,そうしても,初期化はされない

で,テストコードを書いてみる

for (var o in (new Array (3))) { document.writeln (o + "<br/>"); }
// 結果 : 何も無し

document.writeln ((new Array (3)).length + "<br/>");
// 結果 : 3

var array = new Array (3)
for (var i = 0; i < array.length; i++) {
    document.writeln (a[i]);
}
// 結果 : undefined undefined undefined

で,わかることをまとめると,こうかな.

  • 配列は "new Array (size)"で初期化され,メモリが確保さるが,中身は予想通りundefinedである.nullなポインタなわけだな.
  • mapはundefinedな要素に適用されない.

本来なら,配列の写像を得る為のものなので,存在しなと等価なundefinedな要素写像を得ようと言うのはナンセンスだ.

で,こうしてみる.

// yamanekoの考えるmap
Array.prototype.map2 = function (func) {
    if (typeof func != "function") throw new Error ("first argument must be function");
    var tmp = new Array (this.length);
    for (var i  = 0; i < this.length; i++) {
        tmp[i] = func (tmp[i]);
    }
    return tmp;
};

これは,実際に動かしてみたらちゃんと動作した.

ん,まてよ,つーか,当初の目的は初期化する事じゃないか.

ってこは...

Array.prototype.init = function (value) {
    for (var i = 0; i < this.length; i++) {
        this[i] = value;
    }
};

で,十分なわけじゃないか.

ってか,やっぱ,これなんじゃないか.



はい,はい,はい,バカ決定.(ここ,笑いどころなんですよ)