ここでいったんまとめを。
Arrayオブジェクトの拡張というのはちょっと気持ち悪いから、
本当は継承できたらいいのだが、
どうもうまくいかないし、
できても遅そうなので追究はしない。
まとめ
1. Arrayのpushは使うな
2. Arrayのコンストラクタは[ ]を使うべし
3. Arrayの構築のコスト大からは逃れられない
4. オブジェクトのメソッドは外に出すべし
5. メソッドの代入にはprototypeを使う
6. 組込みオブジェクトを拡張すると速くなることがある
7. プロパティの参照はなるべく少なく
8. argumentsオブジェクトの遅さには回避策がある
9. this[i]は不可、this[""+i]は可
10. thisを普通の変数に代入すれば配列の要素に参照できる
1. Arrayのpushは使うな
a.push(b);
は書くほうも読むほうも気分がよいが、遅い。
a[a.length] = b;
の方が、倍速い。
もちろん、
a[i] = b;
の方が速い。
メソッドを使うとだいたい遅い。
a = b.slice(0);
よりも、
var a = [ ];
for(var i = b.length - 1; i >= 0; i--)
a[i] = b[i];
のほうが速い。
2. Arrayのコンストラクタは[ ]を使うべし
var a = new Array();
より、
var a = [ ];
は少し速い。
気持ちがいいし、こちらを使おう。
ちなみに、
var a = new Array(10);
としても、10個領域を確保するのではないため、速くならない。
Arrayは配列ではなく、恐らくハッシュである。
3. Arrayの構築のコスト大からは逃れられない
var a = [ ];
for(var i = 0; i < 10; i++)
a[i] = i;
とすると、a.0、a.1と次々にプロパティを生成していくので遅い。
しかし、これに回避策はない。
4. オブジェクトのメソッドは外に出すべし
function poly() {
this.copy = function(p) {
...
}
...
}
と書くより、
function poly() {
this.copy = poly_copy;
...
}function poly_copy(p) {
...
}
...
と書いたほうが速い。
5. メソッドの代入にはprototypeを使う
poly.protype.copy = poly_copy;function poly() {
...
}function poly_copy(p) {
...
}
...
と書いたほうがさらに速い。