id:mindcatさんのJavaScriptエントリに少しだけコメント
FAQ形式によるJavaScriptの本質がわかる超入門 - 風と宇宙とプログラムが凄く良く出来てて、くやしい。じゃなくて、折角なので少しだけツッコミを。いや、これだけ完成度が高いのにツッコミというのも無粋ですが。
数値を文字列に、逆に文字を数値に変換する
String(x)、Number(x)を推奨されていますが、一応、IE6ではパフォーマンスに差が出る点に注意が必要だと思います。
to_string
(関数呼び出しのコストのため)IE6だとこのように結構な差がでます。(といっても10万回での結果ですが。)
"" + 78ms "" + 63ms String() 125ms String() 125ms
確かにChromeなどString()のほうが少しだけ速いみたいなので、ケースバイケースですね。
JavaScriptで ""+x を文字列変換に使うのは気持ち悪い - 風と宇宙とプログラムのnanto_vi先生のコメントより、"" + xとString(x)は結果が異なる場合があるとのこと…。
Arrayのようにユーザ定義関数でnew しても関数コールしても同じ動作をするもの
これは、instanceofを使うのが割と一般的だと思います。
function MyFunction(){ if (!(this instanceof MyFunction)) { return new MyFunction(); } } alert([ MyFunction() instanceof MyFunction, // true new MyFunction() instanceof MyFunction // true ]);
が、windowオブジェクトに対してinstanceofをするとIE6でわずかではあるがメモリリークがおこる( Working aroung the instanceof memory leak - Ajaxian)ので、一応注意が必要です(window以外にもdocumentとElementでもメモリリークは起きます。)。
オブジェクトに結びつかない関数呼び出しでのthisはwindowになるのを利用して、こういう書き方もできますが、
function MyFunction(){ if (this === window) { return new MyFunction(); } } alert([ MyFunction() instanceof MyFunction, // true new MyFunction() instanceof MyFunction // true ]);
オブジェクトのメソッドをnewする場合を考えるといまひとつです。
var MyObject = { Func:function(){ if (this === window || this === MyObject) { return new MyObject.Func(); } } } alert([ MyObject.Func() instanceof MyObject.Func, // true new MyObject.Func() instanceof MyObject.Func // true ]);
instanceofのメモリリークは10回windowにinstanceofを使っても、最初の1回しかリークしない(しかも50k程度)みたいで、気にしなくても良いかもしれません。
あと、なぜかgotoがなんども出てきて面白かったけどこれはどうでもいい