toSourceってこんなに便利だったのね

恥ずかしながら最近になってやっとtoSource関数の便利さが分かりました。

今まではデバッグ中にFireBugのconsole.info(object)を実行して、中身を確認するためにマウスでポチポチとInspectしていましたが、object.toSource()としておけば中身をすぐ確認できるので非常に重宝しています。

連想配列

特に有効なのは連想配列の中身が知りたい場合で、toStringでは

var assoc = {"a":1,"b":2,"c":3};
assoc.toString();
結果:"[object Object]"

となり解読不能なのですが、toSourceを使えば

 var assoc = {"a":1,"b":2,"c":3};
assoc.toSource();
結果:"({a:1, b:2, c:3})"

となって中身が丸見えでデバッグが楽チンです。

配列

配列の場合、toStringでは

var array = [1,2,3];
array.toString();
結果:"1,2,3"

となり、元々カンマ区切り文字列だったのか、Arrayオブジェクトだったのか区別できませんが、toSourceを使うと

var array = [1,2,3];
array.toSource();
結果:"[1, 2, 3]"

となり、配列だということが分かります。

整数値・文字列

整数値や文字列の場合、toStringでは

var i = 42;
i.toString();
結果:"42"

var s = "42";
s.toString();
結果:"42"

となり、元のオブジェクトが数値だったのか文字列だったのか分かりません。toSourceを使うと

var i = 42;
i.toSource();
結果:"(new Number(42))"

var s = "42";
s.toSource();
結果:"(new String("42"))"

となり、一目瞭然です。まああまり文字列か数値かを気にする場面は無いのですが。

関数

関数の場合は、toStringでは整形済みの、toSourceでは元の関数定義が出てきます。

function func(){alert("func")};
func.toSource();
結果:"function func(){alert("func")}"

function func(){alert("func")};
func.toString();
結果:"function func(){
    alert("func");
}"

上の例のtoStringの結果は、インデントされ、文末の;(セミコロン)が補完されています。

newした関数は、toStringでは"[object Object]"となります。
toSourceでは実際にオブジェクト中に存在するプロパティのみが出てきます。プロトタイプチェーンは辿りません。

function Class(){this.prop=1;};
Class.prototype.test = function(){alert("Class")};
(new Class()).toSource();
結果:"({prop:1})"