■
恐らく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; } };
で,十分なわけじゃないか.
ってか,やっぱ,これなんじゃないか.
はい,はい,はい,バカ決定.(ここ,笑いどころなんですよ)