Javascript hat viele "Tricks" in Bezug auf Typen und Typkonvertierungen. Ich frage mich also, ob diese beiden Methoden gleich sind oder ob es einen Eckfall gibt, der sie unterscheidet.
quelle
Javascript hat viele "Tricks" in Bezug auf Typen und Typkonvertierungen. Ich frage mich also, ob diese beiden Methoden gleich sind oder ob es einen Eckfall gibt, der sie unterscheidet.
Sie sind nicht vollständig identisch, und tatsächlich ruft der als Funktion aufgerufene String-Konstruktor (Ihr erstes Beispiel) am Ende die toString
Methode des übergebenen Objekts auf, zum Beispiel:
var o = { toString: function () { return "foo"; } };
String(o); // "foo"
Wenn sich ein Bezeichner hingegen auf null
oder bezieht undefined
und Sie die toString
Methode nicht verwenden können , gibt es eine TypeError
Ausnahme :
var value = null;
String(null); // "null"
value.toString(); // TypeError
Der String
als Funktion aufgerufene Konstruktor entspricht in etwa:
value + '';
Die Typkonvertierungsregeln von Object- to- Primitive werden in der Spezifikation, der [[DefaultValue]]
internen Operation, ausführlich beschrieben .
Kurz zusammengefasst werden beim Konvertieren von Object- to- String die folgenden Schritte ausgeführt:
toString
Methode aus.
result
ein Grundelement ist , kehren Sie zurück result
, andernfalls fahren Sie mit Schritt 2 fort.valueOf
Methode aus.
result
ein Grundelement ist , kehren Sie zurück result
, andernfalls fahren Sie mit Schritt 3 fort.TypeError
.In Anbetracht der obigen Regeln können wir ein Beispiel für die Semantik geben:
var o = {
toString: function () { return "foo"; },
valueOf: function () { return "bar"; }
};
String(o); // "foo"
// Make the toString method unavailable:
o.toString = null;
String(o); // "bar"
// Also make the valueOf method unavailable:
o.valueOf = null;
try {
String(o);
} catch (e) {
alert(e); // TypeError
}
Wenn Sie mehr über diesen Mechanismus erfahren möchten, würde ich empfehlen, sich die ToPrimitive
und die ToString
internen Operationen anzusehen.
Ich empfehle auch, diesen Artikel zu lesen:
new String(value)
jedem Wert wird immer ein Zeichenfolgenobjekt zurückgegeben.new String({toString: null})
wirft aTypeError
.String()
und haben+ ''
jetzt einen ziemlich signifikanten Unterschied.String(Symbol())
wird ausgeführt, aberSymbol() + ''
wird einen Fehler auslösen (und Symbol () wird im Gegensatz zu null und undefiniert einen Falsey Guard passieren,x && (x + '')
kann also jetzt werfen).value.toString()
wird einen Fehler verursachen, wennvalue
null ist.String(value)
sollte nicht.Beispielsweise:
wird scheitern, weil
value == null
.sollte eine Meldung mit der Aufschrift "null" (oder ähnlich) anzeigen, die jedoch nicht abstürzt.
quelle
String(value)
sollte das gleiche Ergebnis wievalue.toString()
in jedem Fall haben, außer für Werte ohne Eigenschaften wienull
oderundefined
.''+value
wird das gleiche Ergebnis produzieren.quelle
String () [der Konstruktoraufruf ] ruft grundsätzlich .toString () auf
.toString () und String () können für primitive Werte (number, boolean, string) aufgerufen werden und bewirken im Grunde nichts Besonderes:
Beim Aufrufen dieser Funktionen für Objekte wird es jedoch interessant:
Wenn das Objekt über eine eigene .toString () -Funktion verfügt, wird es immer dann aufgerufen, wenn dieses Objekt (explizit / implizit) als Zeichenfolge behandelt werden soll.
Übrigens, wenn Sie dieses Objekt als Zahl behandeln möchten, sollte darin eine .valueOf () -Funktion definiert sein.
Was ist, wenn wir nur .valueOf () definiert haben?
.valueOf (), das im Objekt definiert ist, wird aufgerufen, unabhängig davon, ob das Objekt als Zeichenfolge oder als Zahl behandelt werden soll
quelle