Gemäß dieser Dokumentation
Die String-Darstellungen jedes dieser Objekte sind angehängt zusammen in der Reihenfolge aufgeführt und ausgegeben.
Auch nach antworten
Das + x erzwingt das Objekt x in eine Zeichenkette, die nur [Objekt ist Objekt]:
Also, meine Frage ist
Wenn ich das tue
%Vor% Im ersten Fall wird einfach das Objekt gedruckt (ruft nicht die Methode toString()
auf).
Aber im zweiten Fall wird nicht gezwungen, sondern einfach der Grundwert ausgegeben. Warum ist das so?
Welche Methode ruft console.log
auf, um das Objekt zu drucken?
Bitte beachten Sie, dass dies kein Duplikat von Frage .
Die Konsolen-API ist keine Standard-API, die in einer Spezifikation definiert ist, sondern in allen Browsern implementiert ist, so dass es den Anbietern in der Regel freisteht, sie auf ihre eigene Art und Weise zu implementieren, da es keine Standardspezifikation gibt Methoden in API.
Wenn Sie die tatsächliche Implementierung der Konsolen-API für einen bestimmten Browser nicht überprüfen, können Sie sich nie sicher sein. Auf GitHub gibt es einen Tracker , der die Unterschiede zwischen den wichtigsten Browsern auflistet.
Wenn Sie sich die Implementierung in FF ansehen (verfügbar hier - Suche nach Protokoll), es hat einen Kommentar unter
Eine mehrzeilige Zeichenfolge für ein Objekt, das für Menschen gedacht 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 unterschiedliche Werte für Strings aus, die mit literal
notation erstellt wurden, und Strings, die mit String
constructor erstellt wurden, weil sie zwei verschiedene types
sind. Wie in hier erklärt, werden Strings, die mit Literal Notation erstellt wurden,% genannt co_de% und Strings, die mit dem String-Konstruktor erstellt wurden, heißen String Primitives
.
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
%Vor% Um Ihre Frage zu beantworten, ruft die Console-API in FF String Objects
für das Argument nur dann auf, wenn der Argumenttyp nicht zu toString()
types gehört. Es ruft nicht immer {undefined,null,object,set,map}
oder toString()
Methoden auf. Ich habe die Implementierung von Chrome nicht überprüft, daher werde ich dazu nichts sagen.
console.log(str)
ruft str.valueOf()
auf Ich denke.
Von JavaScript - The Definitive Guide
Seine Aufgabe besteht darin, ein Objekt in einen primitiven Wert zu konvertieren. Die Methode valueOf()
wird automatisch aufgerufen, wenn ein Objekt in einem numerischen Kontext verwendet wird, mit arithmetischen Operatoren (anders als +) und beispielsweise mit den relationalen Operatoren. Die meisten Objekte haben keine vernünftige primitive Darstellung und definieren diese Methode nicht.
--- edit ---- Sorry, kopiere die falsche Zeile, ich meine die "+ str", da gibt es einen Typ, der konvertiert
Tags und Links javascript string object console.log