web-dev-qa-db-ja.com

console.logはオブジェクトのtoStringメソッドを呼び出しますか?

このように documentation

これらの各オブジェクトの文字列表現は、リストされた順序で一緒に追加され、出力されます。

また answer による

+ xは、オブジェクトxを文字列に強制変換します。これは単なる[オブジェクトオブジェクト]です。

だから、私の質問は

私が行った場合

_str = new String("hello")
console.log(str) //prints the string object but not 'hello'
console.log(""+str) //prints "hello"
_

そのため、最初のケースでは、オブジェクトを出力するだけです(toString()メソッドを呼び出さない)。

しかし、2番目のケースでは、強制するのではなく、単純にプリミティブ値を出力します。どうしてこんなことに?

オブジェクトを出力するために_console.log_が呼び出すメソッドはどれですか?

これは question の複製ではないことに注意してください。

26
gurvinder372

コンソールAPIは、仕様で定義されている標準のAPIではなく、すべてのブラウザに実装されるものであり、APIのメソッドの出力を定義する標準の仕様がないため、ベンダーは通常、独自の方法で実装する自由があります。 。

特定のブラウザーのコンソールAPIの実際の実装を確認しない限り、確信が持てません。 GitHubに tracker があり、主要なブラウザーからの実装の違いをリストしています。

FFでの実装を見ると( here -ログを検索)、以下のコメントがあります

人間が使用するために設計されたオブジェクトの複数行の文字列化

実際の実装では、log()に渡される引数のタイプをチェックし、そのタイプに基づいて、異なる表現を生成します。

あなたの場合、log()は、2つの異なるliteralであるため、String表記を使用して作成された文字列とtypesコンストラクタを使用して作成された文字列の2つの異なる値を出力します。説明したように here 、リテラル表記を使用して作成された文字列は_String Primitives_と呼ばれ、文字列コンストラクタを使用して作成された文字列は_String Objects_と呼ばれます。

_var str1 = 'test';
var str2 = new String('hello');

typeof str1 // prints "string"
typeof str2 // prints "object"
_

型が異なるため、文字列表現はコンソールAPIで異なります。 FFのコンソール実装のコードを実行すると、最後のステートメントは

_return "  " + aThing.toString() + "\n";
_

したがって、質問に答えるために、FFのコンソールAPIは、引数の型が_{undefined,null,object,set,map}_型のいずれでもない場合にのみ、引数に対してtoString()を呼び出します。常にtoString()またはvalueOf()メソッドを呼び出すわけではありません。 Chromeの実装をチェックしなかったので、コメントしません。

13
Arkantos

console.log(str)str.valueOf()を呼び出すと思います。 JavaScriptから-決定的なガイドその仕事は、オブジェクトをプリミティブ値に変換することです。 valueOf()メソッドは、算術演算子(+以外)や関係演算子などを使用して、オブジェクトが数値コンテキストで使用されると自動的に呼び出されます。ほとんどのオブジェクトには適切なプリミティブ表現がなく、このメソッドを定義していません。

---編集----申し訳ありませんが、間違った行をコピーします。つまり、型変換があるため、 "" + strを意味します

3
cyl19910101

ToStringを利用しないので、次のようなことができます

clog = function(msg){console.log(msg.toString());}
clog(myObj);
1
A.Zaben