web-dev-qa-db-de.com

Ruft console.log die toString-Methode eines Objekts auf?

Nach dieser Dokumentation ,

Die Zeichenfolgendarstellungen jedes dieser Objekte werden angehängt zusammen in der angegebenen Reihenfolge und Ausgabe.

Auch als per antwort

Das + x zwingt das Objekt x in einen String, der nur [object Objekt]:

Meine Frage ist also

Wenn ich mache

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

Im ersten Fall wird also einfach das Objekt gedruckt (die toString()-Methode wird nicht aufgerufen).

Im zweiten Fall wird jedoch nicht der primitive Wert gedruckt. Warum ist das so?

Welche Methode ruft console.log auf, um das Objekt zu drucken?

Bitte beachten Sie, dass - dies ist kein Duplikat dieser Frage .

17
gurvinder372

Die Konsolen-API ist keine Standard-API, die in einer beliebigen Spezifikation definiert ist, sondern in allen Browsern implementiert ist. Daher können sich die Hersteller normalerweise frei entscheiden, sie auf ihre eigene Weise zu implementieren, da es keine Standardspezifikation gibt, die die Ausgabe von Methoden in der API definiert .

Wenn Sie nicht die tatsächliche Implementierung der Console-API für einen bestimmten Browser überprüfen, können Sie nie sicher sein. Es gibt einen tracker auf GitHub, der die Unterschiede zwischen der Implementierung gegenüber den wichtigsten Browsern auflistet.

Wenn Sie sich die Implementierung in FF ansehen (verfügbar hier - nach Protokoll suchen), wird unten ein Kommentar angezeigt

Eine mehrzeilige Stringifizierung eines Objekts, die für den Menschen bestimmt ist

Die tatsächliche Implementierung prüft den Typ des Arguments, das an log() übergeben wird, und generiert basierend auf seinem Typ eine andere Darstellung. 

In Ihrem Fall gibt log() zwei verschiedene Werte für Zeichenfolgen aus, die mit der literal-Notation erstellt wurden, und Zeichenfolgen, die mit dem String-Konstruktor erstellt wurden, da es sich um zwei verschiedene types-Werte handelt. Wie hier beschrieben, werden mit Literalnotation erstellte Zeichenfolgen String Primitives und mit String-Konstruktor erstellte Zeichenfolgen String Objects genannt.

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

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

Da sich die Typen unterscheiden, unterscheidet sich ihre Zeichenfolgendarstellung in der Konsolen-API. Wenn Sie den Code für die Implementierung von FF Console durchgehen, lautet die letzte Anweisung

return "  " + aThing.toString() + "\n";

Um Ihre Frage zu beantworten, ruft die Konsolen-API in FF toString() nur für das Argument auf, wenn der Argumenttyp kein {undefined,null,object,set,map}-Typ ist. Es werden nicht immer toString()- oder valueOf()-Methoden aufgerufen. Ich habe die Implementierung von Chrome nicht überprüft, daher werde ich dazu nichts kommentieren.

12
Arkantos

console.log(str) ruft str.valueOf() auf. Ich denke ... von JavaScript - The Definitive Guide Seine Aufgabe ist es, ein Objekt in einen primitiven Wert zu konvertieren. Die valueOf()-Methode wird automatisch aufgerufen, wenn ein Objekt in einem numerischen Kontext verwendet wird, beispielsweise mit arithmetischen Operatoren (mit Ausnahme von +) und mit den relationalen Operatoren. Die meisten Objekte haben keine vernünftige primitive Darstellung und definieren diese Methode nicht.

--- edit ---- Entschuldigung, kopiere die falsche Zeile, ich meine das "" + str, da es eine Typkonvertierung gibt 

3
cyl19910101

Es verwendet toString nicht, Sie können so etwas tun

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