まず、次のことを明確にする必要があり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
呼び出した結果をみましょう。ToObject
this
- の内部プロパティの値
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.toString
2 つの異なる方法であるため、異なる結果が得られます。
存在する場合Object.prototype.toString
は上書きされたものを呼び出す必要があると主張することができ ますが、それは実装方法ではありません。toString
toString