Um die Bedienung grundlegender Typwerte zu erleichtern, bietet ECMAScript außerdem drei spezielle Referenztypen: Boolean, Number und String. Diese Typen ähneln den anderen in diesem Kapitel vorgestellten Referenztypen, weisen jedoch auch ein spezielles Verhalten auf, das ihren jeweiligen Basistypen entspricht. Tatsächlich wird jedes Mal, wenn ein Basistypwert gelesen wird, im Hintergrund ein Objekt des entsprechenden Basis-Wrappertyps erstellt, sodass wir einige Methoden aufrufen können, um diese Daten zu bearbeiten. Beispiel unten:
var s1="etwas Text";
var s2=s1.substring(2);
Die Variable s1 in diesem Beispiel enthält einen String. Der String ist natürlich ein Basistypwert, und die nächste Codezeile ruft die substring()-Methode von s1 auf und speichert das zurückgegebene Ergebnis in s2. Wir wissen, dass primitive Typwerte keine Objekte sind, daher sollten sie logischerweise keine Methoden haben (obwohl sie, wie wir es wünschen, solche haben). Damit wir diese intuitive Bedienung erreichen können, wurden tatsächlich eine Reihe von Prozessen automatisch im Hintergrund ausgeführt. Wenn die zweite Codezeile auf s1 zugreift, befindet sich der Zugriffsprozess im Lesemodus, dh der Wert dieser Zeichenfolge wird aus dem Speicher gelesen. Beim Zugriff auf eine Zeichenfolge im Lesemodus wird die folgende Verarbeitung automatisch im Hintergrund abgeschlossen.
1. Erstellen Sie eine Instanz vom Typ String;
2. Rufen Sie die angegebene Methode für die Instanz auf
3. Zerstöre diese Instanz.
Sie können sich die oben genannten drei Schritte als die Ausführung des folgenden ECMAScript-Codes vorstellen.
var s2=s1.substring(2);
s1=null;
Nach dieser Verarbeitung entspricht der grundlegende Zeichenfolgenwert dem Objekt, und die obigen drei Schritte gelten auch für boolesche und numerische Werte, die den Typen Boolean und Number entsprechen.
Der Hauptunterschied zwischen Referenztypen und Basisverpackungstypen ist die Lebensdauer des Objekts. Instanzen von Referenztypen, die mit dem neuen Operator erstellt wurden, bleiben im Speicher, bis der Ausführungsfluss den aktuellen Bereich verlässt. Das automatisch erstellte Basispakettypobjekt existiert nur in dem Moment, in dem eine Codezeile ausgeführt wird, und wird dann sofort zerstört. Dies bedeutet, dass wir zur Laufzeit keine Eigenschaften und Methoden mehr zu primitiven Typwerten hinzufügen können. Als Beispiel unten:
s1.color="red";
alarm(s1.color);//undefiniert
Hier versucht die zweite Codezeile, der Zeichenfolge s1 ein Farbattribut hinzuzufügen. Wenn die dritte Codezeile hier jedoch auf s1 zugreift, fehlt deren Farbeigenschaft. Die Ursache des Problems liegt darin, dass das in der zweiten Zeile erstellte String-Objekt bei der Ausführung der dritten Codezeile zerstört wurde. Die dritte Codezeile erstellt ein eigenes String-Objekt, das kein Farbattribut hat.
Natürlich können Sie Boolean, Number und String explizit aufrufen, um Objekte mit grundlegenden Verpackungstypen zu erstellen. Sie sollten dies jedoch nur tun, wenn es absolut notwendig ist, da Sie leicht aus den Augen verlieren, ob es sich um einen Basis-Wrapper-Typ handelt oder ob Sie auf einen Wert eines Basis-Wrapper-Typs verweisen. Der Aufruf von „typeof“ für eine Instanz eines Basis-Wrapper-Typs gibt „object“ zurück und alle Objekte des Basis-Wrapper-Typs werden in den booleschen Wert „true“ konvertiert.
Der Objektkonstruktor gibt wie eine Factory-Methode auch eine Instanz des entsprechenden Basis-Wrapper-Typs zurück, basierend auf dem Typ des übergebenen Werts. Zum Beispiel:
Alert(obj Instanz von String);//true
Durch die Übergabe einer Zeichenfolge an den Objektkonstruktor wird eine Instanz von „String“ erstellt; durch die Übergabe eines numerischen Parameters wird eine Instanz von „Number“ erhalten, und durch die Übergabe eines booleschen Parameters wird eine Instanz von „Boolean“ erhalten.
Es ist zu beachten, dass sich die Verwendung von new zum Aufrufen des Konstruktors des Basisverpackungstyps vom direkten Aufruf der gleichnamigen Transformationsfunktion unterscheidet. Zum Beispiel:
var number=Number(value); //Transformationsfunktion
warning(typeof number); //"number"
var obj=new Number(value); //Konstruktor
alarm(typeof obj); //"object"
Dans cet exemple, la variable number stocke la valeur de type de base 25 et la variable obj stocke une instance de Number.
Bien que nous ne recommandons pas de créer explicitement des objets de types wrapper de base, leur capacité à manipuler les valeurs de type de base est toujours assez importante. Chaque type de wrapper de base fournit des méthodes pratiques pour manipuler la valeur correspondante.
C’est tout le contenu de cet article, j’espère qu’il vous plaira tous.