1

OK私はそれをやったばかりで、しばらく頭をかきました。Chromeコンソールで次のことを試しました:

var a = [];
toString.call(a); //[object Array]
a.toString(); //""
toString(a); //[object Object] I know it's blunder but still!

toString と .toString の違いは何ですか?私はそれらが異なるスコープ (オブジェクト) からのものであることを明確に知っていますが、いつどちらを使用する必要がありますか? なぜそんなに面倒なのですか?

4

1 に答える 1

6

まず、次のことを明確にする必要がありtoStringますObject.prototype.toString

> toString === Object.prototype.toString
  true

仕様のセクション 15.2.4.2 でどのようObject.prototype.toStringに機能するかが説明されています。

  1. this値がの場合undefined、 を返し"[object Undefined]"ます。
  2. this値がの場合null、 を返し"[object Null]"ます。
  3. 引数として値を渡してO呼び出した結果をみましょう。ToObjectthis
  4. の内部プロパティの値classを とします。[[Class]]O
  5. "[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

于 2013-01-26T01:11:29.283 に答える