JavaScript-Datentypen und Datenstrukturen
Alle Programmiersprachen haben eingebaute Datenstrukturen, aber diese unterscheiden sich oft von einer Sprache zur anderen. Dieser Artikel versucht, die eingebauten Datenstrukturen in JavaScript aufzulisten und ihre Eigenschaften zu beschreiben. Diese können genutzt werden, um andere Datenstrukturen zu erstellen.
DasSprachenüberblick bietet eine ähnliche Zusammenfassung der allgemeinen Datentypen, jedoch mit mehr Vergleichen zu anderen Sprachen.
Dynamische und schwache Typisierung
JavaScript ist einedynamische Sprache mitdynamischen Typen. Variablen in JavaScript sind nicht direkt mit einem bestimmten Werttyp verknüpft und jede Variable kann Werte aller Typen zugewiesen (und neu zugewiesen) bekommen:
let foo = 42; // foo is now a numberfoo = "bar"; // foo is now a stringfoo = true; // foo is now a boolean
JavaScript ist auch eineschwach typisierte Sprache, was bedeutet, dass es eine implizite Typkonvertierung zulässt, wenn eine Operation unpassende Typen beinhaltet, anstatt Typfehler zu werfen.
const foo = 42; // foo is a numberconst result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operandconsole.log(result); // 421
Implizite Umwandlungen sind sehr praktisch, können aber subtile Fehler erzeugen, wenn Konvertierungen dort stattfinden, wo sie nicht erwartet werden, oder wo sie in die andere Richtung erwartet werden (zum Beispiel, von Zeichenfolge zu Zahl anstatt von Zahl zu Zeichenfolge). FürSymbole undBigInts hat JavaScript bewusst bestimmte implizite Typkonvertierungen verboten.
Primitive Werte
Alle Typen außerObject definierenunveränderliche Werte, die direkt auf der untersten Ebene der Sprache dargestellt werden. Wir bezeichnen Werte dieser Typen alsprimitive Werte.
Alle primitiven Typen, außernull
, können mit demtypeof
-Operator getestet werden.typeof null
gibt"object"
zurück, daher muss man=== null
verwenden, umnull
zu testen.
Alle primitiven Typen, außernull
undundefined
, haben ihre entsprechenden Objekt-Wrapper-Typen, die nützliche Methoden zum Arbeiten mit den primitiven Werten bereitstellen. Zum Beispiel bietet dasNumber
-Objekt Methoden wietoExponential()
. Wenn auf eine Eigenschaft eines primitiven Wertes zugegriffen wird, umhüllt JavaScript den Wert automatisch in das entsprechende Wrapper-Objekt und greift stattdessen auf die Eigenschaft im Objekt zu. Allerdings wirft der Zugriff auf eine Eigenschaft vonnull
oderundefined
eineTypeError
-Exception, was die Einführung desoptionalen Verkettungsoperators erforderlich macht.
Typ | typeof Rückgabewert | Objekt-Wrapper |
---|---|---|
Null | "object" | N/V |
Undefined | "undefined" | N/V |
Boolean | "boolean" | Boolean |
Number | "number" | Number |
BigInt | "bigint" | BigInt |
String | "string" | String |
Symbol | "symbol" | Symbol |
Die Referenzseiten der Objekt-Wrapper-Klassen enthalten mehr Informationen über die verfügbaren Methoden und Eigenschaften für jeden Typ sowie detaillierte Beschreibungen der Semantik der primitiven Typen selbst.
Null-Typ
Der Null-Typ wird von genau einem Wert bewohnt:null
.
Undefined-Typ
Der Undefined-Typ wird von genau einem Wert bewohnt:undefined
.
Konzeptionell zeigtundefined
das Fehlen einesWertes an, währendnull
das Fehlen einesObjekts anzeigt (was auch eine Erklärung fürtypeof null === "object"
sein könnte). Die Sprache setzt meistens aufundefined
, wenn etwas keinen Wert hat:
- Eine
return
-Anweisung ohne Wert (return;
) gibt implizitundefined
zurück. - Der Zugriff auf eine nicht existenteObjekt-Eigenschaft (
obj.iDontExist
) gibtundefined
zurück. - Eine Variablendeklaration ohne Initialisierung (
let x;
) initialisiert die Variable implizit mitundefined
. - Viele Methoden, wie
Array.prototype.find()
undMap.prototype.get()
, gebenundefined
zurück, wenn kein Element gefunden wird.
null
wird in der Kernsprache viel seltener verwendet. Der wichtigste Ort ist das Ende derPrototypenkette — dementsprechend akzeptieren oder geben Methoden, die mit Prototypen interagieren, wieObject.getPrototypeOf()
,Object.create()
usw.,null
anstelle vonundefined
zurück.
null
ist einSchlüsselwort, aberundefined
ist ein normalesIdentifier, das zufällig eine globale Eigenschaft ist. In der Praxis ist der Unterschied gering, daundefined
nicht neu definiert oder überschattet werden sollte.
Boolean-Typ
DerBoolean
-Typ repräsentiert eine logische Entität und wird von zwei Werten bewohnt:true
undfalse
.
Boolesche Werte werden normalerweise für bedingte Operationen verwendet, einschließlichternärem Operator,if...else
,while
usw.
Number-Typ
DerNumber
-Typ ist eindoppelter 64-Bit-Gleitkommawert im IEEE 754-Format. Er ist in der Lage, positive Gleitkommazahlen zwischen 2-1074 (Number.MIN_VALUE
) und 21023 × (2 - 2-52) (Number.MAX_VALUE
) sowie negative Gleitkommazahlen desselben Umfangs zu speichern, kann jedoch nur ganze Zahlen im Bereich von -(253 − 1) (Number.MIN_SAFE_INTEGER
) bis 253 − 1 (Number.MAX_SAFE_INTEGER
) sicher speichern. Außerhalb dieses Bereichs kann JavaScript ganze Zahlen nicht mehr sicher darstellen; stattdessen werden sie durch eine Gleitzahl-Doppelformat-Angleichung dargestellt. Sie können überprüfen, ob eine Zahl innerhalb des Bereichs der sicheren Ganzzahlen liegt, indem SieNumber.isSafeInteger()
verwenden.
Werte außerhalb des darstellbaren Bereichs werden automatisch konvertiert:
- Positive Werte, die größer als
Number.MAX_VALUE
sind, werden inInfinity
konvertiert. - Positive Werte, die kleiner als
Number.MIN_VALUE
sind, werden zu0
konvertiert. - Negative Werte, die kleiner als -
Number.MAX_VALUE
sind, werden in-Infinity
konvertiert. - Negative Werte, die größer als -
Number.MIN_VALUE
sind, werden zu-0
konvertiert.
Infinity
und-Infinity
verhalten sich ähnlich wie mathematische Unendlichkeit, jedoch mit einigen geringfügigen Unterschieden; sehen Sie die SeitenNumber.POSITIVE_INFINITY
undNumber.NEGATIVE_INFINITY
für Details.
Der Number-Typ hat nur einen Wert mit mehreren Darstellungen:0
wird sowohl als-0
als auch als+0
(wobei0
ein Alias für+0
ist) dargestellt. In der Praxis gibt es fast keinen Unterschied zwischen den verschiedenen Darstellungen; zum Beispiel ist+0 === -0
true
. Sie können dies jedoch bemerken, wenn Sie durch null teilen:
console.log(42 / +0); // Infinityconsole.log(42 / -0); // -Infinity
NaN
("NichteineZahl") ist eine spezielle Art von Zahlenwert, der typischerweise vorkommt, wenn das Ergebnis einer arithmetischen Operation nicht als Zahl ausgedrückt werden kann. Es ist auch der einzige Wert in JavaScript, der nicht sich selbst entspricht.
Obwohl eine Zahl konzeptionell ein "mathematischer Wert" ist und immer implizit als Gleitkommazahl kodiert ist, stellt JavaScriptBitweise Operatoren bereit. Bei der Anwendung von bitweisen Operatoren wird die Zahl zunächst in eine 32-Bit-Ganzzahl konvertiert.
Hinweis:Auch wenn bitweise Operatorengenutzt werden können, um mehrere Boolesche Werte innerhalb einer einzelnen Zahl mittelsBitmaskierung darzustellen, wird dies in der Regel als schlechte Praxis angesehen. JavaScript bietet andere Mittel, um eine Menge von Booleschen Werten darzustellen (wie ein Array von Booleschen Werten oder ein Objekt mit Booleschen Werten, die auf benannte Eigenschaften zugewiesen sind). Die Bitmaskierung neigt auch dazu, den Code schwerer lesbar, verständlich und wartbar zu machen.
Es kann notwendig sein, solche Techniken in sehr eingeschränkten Umgebungen zu verwenden, wie zum Beispiel beim Umgang mit den Einschränkungen des lokalen Speichers oder in extremen Fällen (wie wenn jedes Bit über das Netzwerk zählt). Diese Technik sollte nur in Betracht gezogen werden, wenn sie das letzte Mittel ist, das ergriffen werden kann, um die Größe zu optimieren.
BigInt-Typ
DerBigInt
-Typ ist ein numerischer primitiver Typ in JavaScript, der Ganzzahlen beliebiger Größe darstellen kann. Mit BigInts können Sie große Ganzzahlen sicher speichern und bearbeiten, selbst über die Grenze der sicheren Ganzzahl hinaus (Number.MAX_SAFE_INTEGER
) für Nummern.
Ein BigInt wird erstellt, indem mann
an das Ende einer Ganzzahl anhängt oder indem man dieBigInt()
-Funktion aufruft.
Dieses Beispiel zeigt, wo das Erhöhen derNumber.MAX_SAFE_INTEGER
das erwartete Ergebnis liefert:
// BigIntconst x = BigInt(Number.MAX_SAFE_INTEGER); // 9007199254740991nx + 1n === x + 2n; // false because 9007199254740992n and 9007199254740993n are unequal// NumberNumber.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // true because both are 9007199254740992
Sie können die meisten Operatoren verwenden, um mit BigInts zu arbeiten, einschließlich+
,*
,-
,**
und%
— der einzige verbotene ist>>>
. Ein BigInt ist nichtstreng gleich einer Zahl mit demselben mathematischen Wert, ist jedochlose so.
BigInt-Werte sind weder immer präziser noch immer weniger präzise als Zahlen, da BigInts keine Bruchzahlen darstellen können, aber große Ganzzahlen genauer darstellen können. Kein Typ schließt den anderen ein, und sie sind nicht gegenseitig austauschbar. EinTypeError
wird ausgelöst, wenn BigInt-Werte mit regulären Zahlen in arithmetischen Ausdrücken gemischt werden, oder wenn sieimplizit konvertiert werden.
String-Typ
DerString
-Typ stellt Textdaten dar und ist als eine Folge von 16-Bit-unsigned Integer-Werten kodiert, dieUTF-16 Code-Einheiten darstellen. Jedes Element im String nimmt eine Position im String ein. Das erste Element befindet sich an Index0
, das nächste an Index1
usw. DieLänge eines Strings ist die Anzahl der UTF-16 Code-Einheiten darin, welche möglicherweise nicht der tatsächlichen Anzahl der Unicode-Zeichen entsprechen; siehe dieString
Referenzseite für mehr Details.
JavaScript-Strings sind unveränderlich. Das bedeutet, dass es nicht möglich ist, einen String nach seiner Erstellung zu ändern. String-Methoden erzeugen neue Strings basierend auf dem Inhalt des aktuellen Strings — zum Beispiel:
- Ein Teilstring des Originalstrings mithilfe von
substring()
. - Eine Verkettung zweier Strings mittels des Verkettungsoperators (
+
) oderconcat()
.
Vorsicht vor dem "stringly-typing" Ihres Codes!
Es kann verlockend sein, Strings zu verwenden, um komplexe Daten darzustellen. Dies bringt kurzfristige Vorteile mit sich:
- Es ist einfach, komplexe Strings mit Verkettung zu erstellen.
- Strings sind leicht debugbar (das, was Sie sehen, wird immer im String sein).
- Strings sind der kleinste gemeinsame Nenner vieler APIs (Eingabefelder, Werte imlokalen Speicher,
fetch()
-Antworten, wennResponse.text()
verwendet wird, etc.) und es kann verlockend sein, nur mit Strings zu arbeiten.
Mit Konventionen ist es möglich, jede Datenstruktur in einem String zu repräsentieren. Das macht es nicht zu einer guten Idee. Zum Beispiel könnte man mit einem Separator eine Liste emulieren (während ein JavaScript-Array besser geeignet wäre). Leider ist, wenn der Separator in einem der "Listen"-Elemente verwendet wird, die Liste zerstört. Ein Escape-Zeichen kann gewählt werden, etc. All dies erfordert Konventionen und schafft eine unnötige Wartungslast.
Verwenden Sie Strings für Textdaten. Bei der Darstellung komplexer Daten,parsen Sie Strings und verwenden Sie die passende Abstraktion.
Symbol-Typ
EinSymbol
ist eineinzigartiger undunveränderlicher primitiver Wert und kann als Schlüssel einer Objekteigenschaft verwendet werden (siehe unten). In einigen Programmiersprachen werden Symbole als "Atom" bezeichnet. Zweck der Symbole ist es, einzigartige Eigenschaftsschlüssel zu erstellen, die garantiert nicht mit Schlüsseln aus anderem Code kollidieren.
Objekte
In der Informatik ist ein Objekt ein Wert im Speicher, der möglicherweise von einemIdentifier referenziert wird. In JavaScript sind Objekte die einzigenveränderlichen Werte.Funktionen sind tatsächlich auch Objekte mit der zusätzlichen Fähigkeit,aufrufbar zu sein.
Eigenschaften
In JavaScript können Objekte als eine Sammlung von Eigenschaften betrachtet werden. Mit derObjektliteral-Syntax wird eine begrenzte Menge an Eigenschaften initialisiert; danach können Eigenschaften hinzugefügt und entfernt werden. Eigenschaften von Objekten sind gleichwertig mit Schlüssel-Wert-Paaren. Eigenschaftsschlüssel sind entwederStrings oderSymbole. Wenn andere Typen (wie Zahlen) verwendet werden, um Objekte zu indizieren, werden die Werte implizit in Strings konvertiert. Eigenschaftswerte können Werte jeden Typs sein, einschließlich anderer Objekte, was es ermöglicht, komplexe Datenstrukturen zu erstellen.
Es gibt zwei Typen von Objekteigenschaften: DieDaten-Eigenschaft und dieZugangs-Eigenschaft. Jede Eigenschaft hat entsprechendeAttribute. Jedes Attribut wird intern von der JavaScript-Engine abgerufen, aber Sie können sie durchObject.defineProperty()
setzen oder durchObject.getOwnPropertyDescriptor()
ablesen. Weitere Informationen zu den verschiedenen Nuancen finden Sie auf der SeiteObject.defineProperty()
.
Daten-Eigenschaft
Daten-Eigenschaften verknüpfen einen Schlüssel mit einem Wert. Sie kann durch die folgenden Attribute beschrieben werden:
value
Der Wert, der durch einen Zugriff auf die Eigenschaft abgerufen wird. Kann jeder JavaScript-Wert sein.
writable
Ein Boolescher Wert, der angibt, ob die Eigenschaft durch eine Zuweisung verändert werden kann.
enumerable
Ein Boolescher Wert, der angibt, ob die Eigenschaft durch eine
for...in
-Schleife aufgezählt werden kann. Siehe auchAufzählbarkeit und Eigentum von Eigenschaften für Informationen darüber, wie Aufzählbarkeit mit anderen Funktionen und Syntaxen interagiert.configurable
Ein Boolescher Wert, der angibt, ob die Eigenschaft gelöscht werden kann, in eine Zugangs-Eigenschaft geändert werden kann und ob ihre Attribute geändert werden können.
Zugangs-Eigenschaft
Verknüpft einen Schlüssel mit einer von zwei Zugriffs-Funktionen (get
undset
), um einen Wert abzurufen oder zu speichern.
Hinweis:Es ist wichtig, zu erkennen, dass es sich um eine Zugangs-Eigenschaft handelt, nicht um eine Zugangs-Methode. Wir können einem JavaScript-Objekt klassenähnliche Zugänge geben, indem wir eine Funktion als Wert verwenden — das macht das Objekt jedoch nicht zu einer Klasse.
Eine Zugangs-Eigenschaft hat die folgenden Attribute:
get
Eine Funktion, die mit einer leeren Argumentliste aufgerufen wird, um den Eigenschaftswert abzurufen, wann immer ein Zugriff auf den Wert erfolgt. Siehe auchGetter. Kann
undefined
sein.set
Eine Funktion, die mit einem Argument aufgerufen wird, das den zugewiesenen Wert enthält. Wird ausgeführt, wenn eine bestimmte Eigenschaft verwechselt werden soll. Siehe auchSetter. Kann
undefined
sein.enumerable
Ein Boolescher Wert, der angibt, ob die Eigenschaft durch eine
for...in
-Schleife aufgezählt werden kann. Siehe auchAufzählbarkeit und Eigentum von Eigenschaften für Informationen darüber, wie Aufzählbarkeit mit anderen Funktionen und Syntaxen interagiert.configurable
Ein Boolescher Wert, der angibt, ob die Eigenschaft gelöscht werden kann, in eine Daten-Eigenschaft geändert werden kann und ob ihre Attribute geändert werden können.
DasPrototype eines Objekts zeigt auf ein anderes Objekt oder aufnull
— es ist konzeptionell eine versteckte Eigenschaft des Objekts, die üblicherweise als[[Prototype]]
dargestellt wird. Eigenschaften des Objekts[[Prototype]]
können auch auf das Objekt selbst zugreifen.
Objekte sind zusammengewürfelte Schlüssel-Wert-Paare, weshalb sie oft als Maps verwendet werden. Dies kann jedoch Ergonomie-, Sicherheits- und Leistungsprobleme verursachen. Verwenden Sie stattdessen eineMap
, um beliebige Daten zu speichern. DieMap
-Referenz enthält eine detailliertere Diskussion der Vor- und Nachteile zwischen einfachen Objekten und Maps zum Speichern von Schlüssel-Wert-Assoziationen.
Datum
Indizierte Sammlungen: Arrays und Typisierte Arrays
Arrays sind reguläre Objekte, bei denen es eine besondere Beziehung zwischen Ganzzahlschlüsseleigenschaften und derlength
-Eigenschaft gibt.
Darüber hinaus erben Arrays vonArray.prototype
, das eine Reihe nützlicher Methoden zur Manipulation von Arrays bietet. Zum Beispiel suchtindexOf()
einen Wert im Array undpush()
hängt ein Element an das Array an. Dies macht Arrays zu einer perfekten Wahl, um geordnete Listen darzustellen.
Typisierte Arrays stellen eine arrayähnliche Ansicht eines zugrunde liegenden binären Datenpuffers dar und bieten viele Methoden, die ähnliche Semantiken wie die Array-Gegenstücke haben. "Typisiertes Array" ist ein Oberbegriff für eine Reihe von Datenstrukturen, einschließlichInt8Array
,Float32Array
usw. Sehen Sie dietypisierte Array Seite für mehr Informationen. Typisierte Arrays werden oft in Verbindung mitArrayBuffer
undDataView
verwendet.
Keyed-Sammlungen: Maps, Sets, WeakMaps, WeakSets
Diese Datenstrukturen nehmen Objekt-Referenzen als Schlüssel.Set
undWeakSet
repräsentieren eine Sammlung einzigartiger Werte, währendMap
undWeakMap
eine Sammlung von Schlüssel-Wert-Zuordnungen darstellen.
Sie könntenMap
s undSet
s selbst implementieren. Da jedoch Objekte nicht vergleichbar sind (im Sinne von "<" "weniger als", zum Beispiel), und die Engine ihre Hash-Funktion für Objekte nicht offenlegt, wäre die Suchleistung zwangsläufig linear. Native Implementierungen davon (einschließlichWeakMap
s) können Suchleistungen bieten, die ungefähr logarithmisch bis konstant sind.
Üblicherweise, um Daten an einen DOM-Knoten zu binden, könnte man Eigenschaften direkt am Objekt setzen oderdata-*
Attribute verwenden. Der Nachteil davon ist, dass die Daten für jedes Skript im gleichen Kontext verfügbar sind.Map
s undWeakMap
s machen es einfach,privat Daten an ein Objekt zu binden.
WeakMap
undWeakSet
erlauben nur als Schlüssel speicherbereinigbare Werte, die entweder Objekte odernicht registrierte Symbole sind, und die Schlüssel können auch dann gesammelt werden, wenn sie in der Sammlung verbleiben. Sie werden speziell zurOptimierung des Speicherverbrauchs verwendet.
Strukturierte Daten: JSON
JSON (JavaScriptObjektNotation) ist ein leichtgewichtiges Datenaustauschformat, das von JavaScript abgeleitet wurde, aber von vielen Programmiersprachen verwendet wird. JSON erstellt universelle Datenstrukturen, die zwischen verschiedenen Umgebungen und sogar zwischen Sprachen übertragen werden können. Sehen SieJSON
für mehr Details.
Weitere Objekte in der Standardbibliothek
JavaScript hat eine Standardbibliothek von eingebauten Objekten. Lesen Sie dieReferenz, um mehr über die eingebauten Objekte zu erfahren.
Typumwandlungen
Wie oben erwähnt, ist JavaScript eineschwach typisierte Sprache. Das bedeutet, dass Sie oft einen Wert eines Typs verwenden können, wo ein anderer Typ erwartet wird, und die Sprache ihn für Sie in den richtigen Typ konvertiert. Dazu definiert JavaScript eine Handvoll Umwandlungsregeln.
Primitive Umwandlung
Der Prozess derprimitiven Umwandlung wird verwendet, wenn ein primitiver Wert erwartet wird, aber es keine starke Präferenz dafür gibt, welcher tatsächliche Typ es sein sollte. Dies ist normalerweise der Fall, wenn einString, eineZahl oder einBigInt gleichermaßen akzeptabel sind. Zum Beispiel:
- Der
Date()
-Konstruktor, wenn er ein Argument erhält, das keineDate
-Instanz ist — Strings repräsentieren Date-Strings, während Zahlen Zeitstempel repräsentieren. - Der
+
-Operator — wenn einer der Operanden ein String ist, wird String-Verkettung durchgeführt; ansonsten wird numerische Addition durchgeführt. - Der
==
-Operator — wenn ein Operand ein primitiver Wert ist, während der andere ein Objekt ist, wird das Objekt in einen primitiven Wert konvertiert, ohne einen bevorzugten Typ zu haben.
Diese Operation führt keine Konvertierung durch, wenn der Wert bereits ein primitiver Wert ist. Objekte werden durch Aufrufen ihrer[Symbol.toPrimitive]()
(mit"default"
als Hinweis),valueOf()
, undtoString()
-Methoden, in dieser Reihenfolge, in primitive Werte konvertiert. Beachten Sie, dass die primitive KonvertierungvalueOf()
vortoString()
aufruft, was dem Verhalten derZahlenumwandlung ähnlich ist, aber sich von derString-Umwandlung unterscheidet.
Die[Symbol.toPrimitive]()
-Methode, falls vorhanden, muss einen primitiven Wert zurückgeben — das Zurückgeben eines Objektes führt zu einemTypeError
. FürvalueOf()
undtoString()
, wenn eine ein Objekt zurückgibt, wird der Rückgabewert ignoriert und der Rückgabewert der anderen verwendet; wenn keine vorhanden ist oder keine einen primitiven Wert zurückgibt, wird einTypeError
ausgelöst. Zum Beispiel, im folgenden Code:
console.log({} + []); // "[object Object]"
Sowohl{}
als auch[]
haben keine[Symbol.toPrimitive]()
-Methode. Beide erbenvalueOf()
vonObject.prototype.valueOf
, das das Objekt selbst zurückgibt. Da der Rückgabewert ein Objekt ist, wird er ignoriert. Daher wird stattdessentoString()
aufgerufen.{}.toString()
gibt"[object Object]"
zurück, während[].toString()
""
zurückgibt, so dass das Ergebnis ihre Verkettung ist:"[object Object]"
.
Die[Symbol.toPrimitive]()
-Methode hat immer Vorrang bei der Umwandlung in jeden primitiven Typ. Primitive Umwandlung verhält sich allgemein wie die Zahlenumwandlung, davalueOf()
Vorrang hat; jedoch können Objekte mit benutzerdefinierten[Symbol.toPrimitive]()
-Methoden wählen, um beliebige Primitive zurückzugeben.Date
undSymbol
Objekte sind die einzigen eingebauten Objekte, die die[Symbol.toPrimitive]()
-Methode überschreiben.Date.prototype[Symbol.toPrimitive]()
behandelt den"default"
-Hinweis, als ob es"string"
wäre, währendSymbol.prototype[Symbol.toPrimitive]()
den Hinweis ignoriert und immer ein Symbol zurückgibt.
Numerische Umwandlung
Es gibt zwei numerische Typen:Number undBigInt. Manchmal erwartet die Sprache speziell eine Zahl oder einen BigInt (wieArray.prototype.slice()
, wo der Index eine Zahl sein muss); andere Male kann sie entweder tolerieren und unterschiedliche Operationen abhängig vom Typ des Operanden durchführen. Für strikte Umwandlungsprozesse, die keine implizite Konvertierung vom anderen Typ zulassen, sieheZahlenumwandlung undBigInt-Umwandlung.
Numerische Umwandlung ist fast identisch mit derZahlenumwandlung, außer dass BigInts als solche zurückgegeben werden, anstatt einenTypeError
zu verursachen. Numerische Umwandlung wird von allen arithmetischen Operatoren verwendet, da sie sowohl für Zahlen als auch für BigInts überladen sind. Die einzige Ausnahme ist dasunäre Plus, das immer eine Zahlenumwandlung vornimmt.
Weitere Umwandlungen
Alle Datentypen, außer Null, Undefined und Symbol, haben ihren jeweiligen Umwandlungsprozess. SieheString-Umwandlung,Boolean-Umwandlung, undObjektumwandlung für mehr Details.
Wie Sie vielleicht bemerkt haben, gibt es drei unterschiedliche Wege, durch die Objekte in Primitive umgewandelt werden können:
- Primitive Umwandlung:
[Symbol.toPrimitive]("default")
→valueOf()
→toString()
- Numerische Umwandlung,Zahlenumwandlung,BigInt-Umwandlung:
[Symbol.toPrimitive]("number")
→valueOf()
→toString()
- String-Umwandlung:
[Symbol.toPrimitive]("string")
→toString()
→valueOf()
In allen Fällen muss[Symbol.toPrimitive]()
vorhanden und aufrufbar sein und einen primitiven Wert zurückgeben, währendvalueOf
odertoString
ignoriert werden, wenn sie nicht aufrufbar sind oder ein Objekt zurückgeben. Am Ende des Prozesses, wenn er erfolgreich ist, wird das Ergebnis garantiert ein primitiver Wert sein. Der resultierende primitive Wert wird dann in weiteren Umwandlungen je nach Kontext unterzogen.
Siehe auch
- JavaScript Data Structures and Algorithms von Oleksii Trekhleb
- Computer Science in JavaScript von Nicholas C. Zakas
MDN-Feedback-Box
Diese Seite wurde automatisch aus dem Englischen übersetzt.