Object.prototype.toString()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Die toString()
-Methode von Object
-Instanzen gibt eine Zeichenkette zurück, die dieses Objekt repräsentiert. Diese Methode soll von abgeleiteten Objekten für eine benutzerdefinierte Typumwandlungslogik überschrieben werden.
Probieren Sie es aus
Syntax
toString()
Parameter
Standardmäßig nimmt toString()
keine Parameter. Objekte, die von Object
erben, können es jedoch mit eigenen Implementierungen überschreiben, die Parameter entgegennehmen. Zum Beispiel nehmen die Methoden Number.prototype.toString()
und BigInt.prototype.toString()
einen optionalen radix
-Parameter an.
Rückgabewert
Eine Zeichenkette, die das Objekt repräsentiert.
Beschreibung
JavaScript ruft die toString
-Methode auf, um ein Objekt in einen primitiven Wert zu konvertieren. In der Regel brauchen Sie die toString
-Methode nicht selbst aufzurufen; JavaScript ruft sie automatisch auf, wenn es auf ein Objekt trifft, bei dem ein primitiver Wert erwartet wird.
Diese Methode wird bei der Zeichenkettenumwandlung vorrangig aufgerufen, aber bei numerischer Umwandlung und primitiver Umwandlung wird valueOf()
vorrangig aufgerufen. Da die Basis-Methode valueOf()
jedoch ein Objekt zurückgibt, wird in der Regel die toString()
-Methode am Ende aufgerufen, es sei denn, das Objekt überschreibt valueOf()
. Zum Beispiel gibt +[1]
den Wert 1
zurück, weil seine toString()
Methode "1"
zurückgibt, die dann in eine Zahl umgewandelt wird.
Alle Objekte, die von Object.prototype
erben (das sind alle außer {Null-Prototyp-Objekte}), erben die toString()
-Methode. Wenn Sie ein benutzerdefiniertes Objekt erstellen, können Sie toString()
überschreiben, um eine benutzerdefinierte Methode aufzurufen, sodass Ihr benutzerdefiniertes Objekt in einen Zeichenkettenwert umgewandelt werden kann. Alternativ können Sie eine [Symbol.toPrimitive]()
Methode hinzufügen, die noch mehr Kontrolle über den Umwandlungsprozess erlaubt und immer valueOf
oder toString
für jede Art der Umwandlung vorgezogen wird.
Um die Basis-Object.prototype.toString()
mit einem Objekt zu verwenden, das sie überschrieben hat (oder um sie auf null
oder undefined
aufzurufen), müssen Sie Function.prototype.call()
oder Function.prototype.apply()
darauf aufrufen und das zu inspizierende Objekt als erstes Argument (genannt thisArg
) übergeben.
const arr = [1, 2, 3];
arr.toString(); // "1,2,3"
Object.prototype.toString.call(arr); // "[object Array]"
Object.prototype.toString()
gibt "[object Type]"
zurück, wobei Type
der Objekttyp ist. Wenn das Objekt eine Symbol.toStringTag
Eigenschaft hat, deren Wert eine Zeichenkette ist, wird dieser Wert als Type
verwendet. Viele eingebaute Objekte, einschließlich Map
und Symbol
, haben ein Symbol.toStringTag
. Einige Objekte, die ES6 vorausgehen, haben kein Symbol.toStringTag
, aber trotzdem ein spezielles Tag. Dazu gehören (das Tag ist gleich dem unten angegebenen Typnamen):
Das arguments
Objekt gibt "[object Arguments]"
zurück. Alles andere, einschließlich benutzerdefinierter Klassen, es sei denn, mit einem benutzerdefinierten Symbol.toStringTag
, wird "[object Object]"
zurückgeben.
Object.prototype.toString()
aufgerufen auf null
und undefined
gibt respektive [object Null]
und [object Undefined]
zurück.
Beispiele
Überschreiben von toString für benutzerdefinierte Objekte
Sie können eine Funktion erstellen, die anstelle der Standard-toString()
-Methode aufgerufen wird. Die toString()
-Funktion, die Sie erstellen, sollte einen Zeichenkettenwert zurückgeben. Wenn sie ein Objekt zurückgibt und die Methode implizit während der Typumwandlung aufgerufen wird, wird ihr Ergebnis ignoriert und der Wert einer verwandten Methode, valueOf()
, wird stattdessen verwendet, oder ein TypeError
wird ausgelöst, wenn keine dieser Methoden einen primitiven Wert zurückgibt.
Der folgende Code definiert eine Dog
Klasse.
class Dog {
constructor(name, breed, color, sex) {
this.name = name;
this.breed = breed;
this.color = color;
this.sex = sex;
}
}
Wenn Sie die toString()
Methode aufrufen, entweder explizit oder implizit, auf einer Instanz von Dog
, gibt sie den Standardwert zurück, der von Object
geerbt wird:
const theDog = new Dog("Gabby", "Lab", "chocolate", "female");
theDog.toString(); // "[object Object]"
`${theDog}`; // "[object Object]"
Der folgende Code überschreibt die Standard-toString()
-Methode. Diese Methode generiert eine Zeichenkette, die den name
, die breed
, die color
und das sex
des Objekts enthält.
class Dog {
constructor(name, breed, color, sex) {
this.name = name;
this.breed = breed;
this.color = color;
this.sex = sex;
}
toString() {
return `Dog ${this.name} is a ${this.sex} ${this.color} ${this.breed}`;
}
}
Mit dem vorhergehenden Code wird jedes Mal, wenn eine Instanz von Dog
in einem Zeichenkettenkontext verwendet wird, von JavaScript automatisch die toString()
-Methode aufgerufen.
const theDog = new Dog("Gabby", "Lab", "chocolate", "female");
`${theDog}`; // "Dog Gabby is a female chocolate Lab"
Verwendung von toString() zur Erkennung der Objektklasse
toString()
kann mit jedem Objekt verwendet werden und erlaubt es (standardmäßig), dessen Klasse zu ermitteln.
const toString = Object.prototype.toString;
toString.call(new Date()); // [object Date]
toString.call(new String()); // [object String]
// Math has its Symbol.toStringTag
toString.call(Math); // [object Math]
toString.call(undefined); // [object Undefined]
toString.call(null); // [object Null]
Die Verwendung von toString()
auf diese Weise ist unzuverlässig; Objekte können das Verhalten von Object.prototype.toString()
durch die Definition einer Symbol.toStringTag
Eigenschaft ändern, was zu unerwarteten Ergebnissen führen kann. Zum Beispiel:
const myDate = new Date();
Object.prototype.toString.call(myDate); // [object Date]
myDate[Symbol.toStringTag] = "myDate";
Object.prototype.toString.call(myDate); // [object myDate]
Date.prototype[Symbol.toStringTag] = "prototype polluted";
Object.prototype.toString.call(new Date()); // [object prototype polluted]
Spezifikationen
Specification |
---|
ECMAScript Language Specification # sec-object.prototype.tostring |
Browser-Kompatibilität
BCD tables only load in the browser