JavaScript Umformung von Objekt zu Primitiv

Jetzt ist es an der Zeit herauszufinden, was passiert, wenn Sie Objekte hinzufügen obj1 + obj2, abziehen obj1 - obj2 oder mit alert(obj) ausgeben. In solch einem Fall werden Objekte automatisch in Primitive umgewandelt, danach wird die Operation durchgeführt. Hier sind die Hauptregeln für numerische, Zeichenketten und boolsche Umwandlungen von Objekten:

  • Insgesamt werden Objekte in einer boolschen Umwandlung als wahr betrachtet. Es gibt lediglich Zeichenketten- und numerische Umwandlungen.
  • Die numerischen Umwandlungen finden statt, wenn Objekte subtrahiert oder mathematische Funktionen angewandt werden.
  • Zeichenkettenumwandlung geschieht, wenn wir ein Objekt wie alert(obj) ausgeben und in ähnlichen Kontexten.

ToPrimitive

Es ist möglich, die Zeichenketten und numerische Umwandlung zu verbessern. Um dieses Ziel zu erreichen, müssen Sie einzigartige Objektmethoden verwenden.

Wir beobachten drei Varianten der Typumwandlung, auch bekannt als “Hinweise”, die in der Spezifikation beschrieben sind:

"string"

Im Falle einer Objekt-zu-Zeichenkette-Umwandlung, während man auf einem Objekt arbeitet, das eine Zeichenkette erwartet, wie alert:

// output
alert(obj);

// using object as a property key
anotherObj[obj] = 120;

"number"

Im Falle einer Objekt-zu-Zahl-Umwandlung, wie wenn Sie Mathematik betreiben:

// explicit conversion
let num = Number(obj);
// maths (except binary plus)
let n = +obj; // unary plus
let delta = obj1 - obj2;
// less/greater comparison
let greater = obj1 > obj2;

"default"

Es passiert selten, im Falle, dass der Operator nicht sicher weiß, welchen Typ er erwarten soll. Zum Beispiel wird das binäre + sowohl mit Zahlen als auch mit Zeichenketten arbeiten. Wenn das binäre + ein Objekt als Argument hat, wird es das "default" zur Umwandlung verwenden.

Wenn Sie ein Objekt mit einem Symbol, einer Zahl oder einer Zeichenkette mit == vergleichen, ist es nicht klar, welche Umwandlung besser zu machen ist. Deshalb ist es besser, den "default"-Hinweis zu verwenden.

// binary plus uses the "default" hint
let total = obj1 + obj2;

// obj == number uses the "default" hint
if (car == 1) { ...
};

Die größeren und kleineren Vergleichsoperatoren <, > arbeiten ebenfalls mit Zahlen und Zeichenketten. Beachten Sie jedoch, dass in diesem Fall der "number"-Hinweis verwendet wird, nicht das "default", wie in den vorherigen Beispielen.

In der Praxis müssen Sie sich diese Details allerdings nicht merken, fast alle eingebauten Objekte (die Ausnahme ist das Date-Objekt).

Für die Implementierung der Umwandlung muss JavaScript drei Objektmethoden finden und aufrufen. Diese sind wie folgt:

  • Ruf obj[Symbol.toPrimitive](hinweis) auf - eine Methode, die einen symbolischen Schlüssel Symbol.toPrimitive beinhaltet. Wenn solche Methoden bestehen,
  • In anderen Fällen, wenn der Hinweis "string" ist, versuche obj.toString() und obj.valueOf() fortzuführen.
  • Wenn der Hinweis "default" oder "number" ist, versuche obj.valueOf() und obj.toString() fortzuführen.

Symbol.toPrimitive

Das erste, was Sie wissen sollten, ist, dass es eine eingebaute Methode gibt, die als Symbol.toPrimitive bekannt ist. Im Allgemeinen können Sie es verwenden, um Ihre Umwandlungsmethode wie folgt zu benennen:

obj[Symbol.toPrimitive] = function (hint) {
  // must return a primitive value
  // hint = one of "string", "number", "default"
};

Im folgenden Beispiel wendet das Auto-Objekt es an:

Javascript object symbol convert to primitive
let car = { name: "BMW", price: 30000, [Symbol.toPrimitive](hint) { console.log(`hint: ${hint}`); return hint == "string" ? `{name: "${this.name}"}` : this.price; } }; // conversions demo: console.log(car); // hint: string -> {name: "BMW"} console.log(+car); // hint: number -> 30000 console.log(car + 5000); // hint: default -> 35000

toString/valueOf

Jetzt ist es an der Zeit, über die toString und valueOf Methoden zu lernen. Wundern Sie sich nicht, dass sie nicht als Symbole betrachtet werden. Sie gehören zu den ältesten Methoden.

Der Hauptzweck dieser Methoden besteht darin, eine “altmodische” Möglichkeit zur Durchführung der Umwandlung zu bieten.

Wenn Symbol.toPrimitive nicht vorhanden ist, wird JavaScript versuchen, sie in der folgenden Reihenfolge zu finden:

  1. toString -> valueOf im Falle von “Zeichenkette” hinweis.
  2. valueOf -> toString in anderen Fällen

Die oben genannten Methoden liefern einen primitiven Wert. Die Rückgabe eines Objektes durch valueOf oder toString bedeutet, dass es ignoriert wird.

Ein Objekt enthält toString und valueOf Methoden wie folgt:

  • "[object Object]" wird von der toString Methode zurückgegeben.
  • Das Objekt selbst wird von der valueOf Methode zurückgegeben.

Lassen Sie uns diesen Fall betrachten:

Javascript object valueOf -> toString
let site = { name: "W3Docs" }; console.log(site); // [object Object] console.log(site.valueOf() === site); // true

Daher erhalten Sie immer, wenn Sie ein Objekt als Zeichenkette verwenden, [object Object].

Die Arten der Rückgabe

Zunächst sollten Sie beachten, dass Methoden zur primitiven Umformung niemals das primitiv zurückgeben, das angedeutet wurde. Sie können nicht steuern, ob die toString-Methode eine Zeichenkette oder Symbol.toPrimitive den "number" zurückgibt.

Eines ist obligatorisch: Die oben genannten Methoden müssen ein Primitiv zurückgeben und niemals ein Objekt.

Weitere Umformungen

Sie haben bereits gelernt, dass eine Vielzahl von Operatoren und Funktionen Typumwandlungen implementieren. Beispielsweise wird das Multiplizieren * die Operanden in Zahlen umwandeln.

Im Falle, dass ein Objekt als Argument übergeben wird, können zwei Stufen unterschieden werden:

  • Das Objekt wurde in ein Primitiv umgewandelt.
  • Wenn das resultierende Primitiv nicht vom richtigen Typ ist, wird es umgewandelt.

Lassen Sie uns dieses Beispiel betrachten:

Javascript object toString method
let obj = { //toString is capable of handling all conversions in the absence of different methods toString() { return "2"; } }; console.log(obj * 3); // 6, the object is converted to primitive "2", after which a number is made by multiplication

Hier wird als erster Schritt das Objekt durch die Multiplikation obj * 3 in ein Primitiv umgewandelt. Danach wird "2" * 3 in 2 * 3 umgewandelt.

In demselben Zustand werden Zeichenketten durch das binäre Plus verkettet, da es eine Zeichenkette akzeptiert. Hier ist ein Beispiel:

Javascript object toString method
let obj = { toString() { return "2"; } }; console.log(obj + 3); // 23 ("2" + 3), the object is converted to primitive returned a string => concatenation

Zusammenfassung

Die Umwandlung von Objekt zu Primitiv kann automatisch von einer Reihe von eingebauten Funktionen und Operatoren ausgelöst werden, die ein primitiv als Wert erwarten.

Es hat folgende drei Hinweise:

  1. "string" wird für alert sowie andere Operationen verwendet, die eine Zeichenkette erfordern;
  2. "number" (wird für mathematische Operationen verwendet)
  3. "default"(nicht viele Operatoren)

Der Algorithmus der Umwandlung ist wie folgt:

  1. Führe obj[Symbol.toPrimitive](hinweis) aus, falls es eine Methode gibt
  2. In anderen Fällen, wenn der Hinweis "string" ist . versuche obj.toString() und obj.valueOf() fortzusetzen, je nachdem, was vorhanden ist
  3. Im Falle, dass der Hinweis "default" oder "number" ist . versuche obj.valueOf() und obj.toString() fortzusetzen, je nachdem, was vorhanden ist.

Quizzeit: Testen Sie Ihre Fähigkeiten!

Sind Sie bereit, das Gelernte herauszufordern? Tauchen Sie ein in unsere interaktiven Quizze für ein tieferes Verständnis und eine unterhaltsame Art, Ihr Wissen zu festigen.

Finden Sie das nützlich?