2012-01-01 10 views
10
ここ

は、以下のJavaScriptで質問です:のtoStringの結果はtoString.callと異なっているのはなぜなぜ "foo" .toString()はtoString.call( "foo")と同じではないのですか?

// Tested via Google Chrome console. 
var toString = Object.prototype.toString; 

"foo".toString(); // "foo" 
toString.call("foo"); // [object String] 

[].toString(); // "" 
toString.call([]); // [object Array] 

{}.toString(); // syntax error 
toString.call({}); // [object Object] 

()?

String.prototype.toString.call("foo"); // "foo" 
Object.prototype.toString.call("foo"); // [object String] 

を更新し

は、以下のようなプロトタイプチェーンからではないString.prototype.toStringていますか? String内

のtoString [見つかりません] - > String.prototypeのtoString [見つからない]

      --> toString in Object.prototype[found] 
+0

ないjavascriptの専門家を、私はそれが事前に定義された関数を呼び出すとは対照的に、それをnullパラメータを渡すことに関係している疑いがあるでしょう存在しないオブジェクトに対して関数を呼び出す。 – bdares

+0

これらの結果をどのように検査しますか?ブラウザコンソール、または他の何か? –

+0

@ShadowWizard Chromeブラウザコンソール。 –

答えて

16

String.prototype.toStringオーバーライドObject.prototype.toString。それらは同じ機能ではありません。 specification of String.prototype.toStringから

戻り、この文字列値。 (Stringオブジェクトのために、のtoString方法はのvalueOf方法と同じものを返すために起こる、ということに注意してください。)

Object.prototype.toStringを:

のtoString方法がある場合にはと呼ばれ、以下のステップがとられる:

  1. この値を引数として渡すToObjectを呼び出した結果になります。
  2. クラス,の[[クラス]]内部プロパティの値とします。
  3. リターン3つの文字列「[オブジェクト」、クラス、および「]」を連結した結果である文字列値。

配列が同様の挙動を、彼らはまた、toString()上書き:

> [1,2].toString() 
    "1,2" 
4
>>> String.prototype.toString.call("foo") 
"foo" 

オブジェクトは、文字列と同じものではありません。

+0

Stringの** toString **メソッドは 'String .__ proto__'のものですか?そして 'String .__ proto__'は' Object'でなければなりません。なぜ** toString **はObjectの** toString **と等しくないのですか? –

+1

はい、StringはObject toStringをオーバーライドして、[Object X]よりも面白いプリントアウトを表示します。それがデフォルトのtoStringをオーバーライドしなかった場合、あなたの考えは正しいでしょう。 –

-1

グローバルtoStringの機能は、object.toString()の機能とは異なります。 this sourceによれば、グローバルtoString関数はあまりよく定義されておらず、したがって異なるブラウザ間で悪い実装が行われています。基本的には、typeofオペレータと同様の機能を提供します。

+0

toString OPが参照しているのは、よく定義されていない「グローバルtoString」ではなく、OP –

+0

によって「var toString = Object.prototype.toString」として非常によく定義されています。 。謝罪。 – Jivings

関連する問題