まず、次のことを明確にする必要がありtoStringますObject.prototype.toString。
> toString === Object.prototype.toString
true
仕様のセクション 15.2.4.2 でどのようObject.prototype.toStringに機能するかが説明されています。
this値がの場合undefined、 を返し"[object Undefined]"ます。
this値がの場合null、 を返し"[object Null]"ます。
- 引数として値を渡して
O呼び出した結果をみましょう。ToObjectthis
- の内部プロパティの値
classを とします。[[Class]]O
"[object "3 つの String 、class、およびを連結した結果である String 値を返します"]"。
toString.call(a)は と同じでObject.prototype.toString.call(a)あり、上記のアルゴリズムに従って動作します:this配列を参照しa( を使用したため.call)、内部[[Class]]プロパティの値Arrayは であるため、出力は[object Array]です。
a.toString(): 配列は、セクション 15.4.4.2toStringで定義されているプロパティを上書きします。つまり、すべての配列要素が連結され、配列が空であるため、結果として空の文字列が得られます。
toString(a)と同じObject.prototype.toString()です。引数は単に無視されます。したがって、オブジェクトであるthisを参照しObject.prototype、上記のアルゴリズムによれば、出力は[object Object]です。出力は のどの値でも同じですa。
どれをいつ使うべきですか?
それはあなたが何をしたいかによって異なります。個人的にはtoString、いくつかの迅速で汚いデバッグを除いて、特に役立つ組み込み関数はないと思います。
toString.call(a)する必要があります== a.toString()
Object.prototype.toStringとは単にArray.prototype.toString2 つの異なる方法であるため、異なる結果が得られます。
存在する場合Object.prototype.toStringは上書きされたものを呼び出す必要があると主張することができ ますが、それは実装方法ではありません。toStringtoString