Ausdrücke und Operatoren
Dieses Kapitel beschreibt die Ausdrücke und Operatoren in JavaScript, einschließlich Zuweisung, Vergleich, Arithmetik, Bitweise, Logik, Zeichenfolge, Ternär und mehr.
Auf einer hohen Ebene ist einAusdruck eine gültige Einheit von Code, die zu einem Wert aufgelöst wird. Es gibt zwei Arten von Ausdrücken: solche, die Seiteneffekte haben (wie das Zuweisen von Werten) und solche, die reinausgewertet werden.
Der Ausdruckx = 7
ist ein Beispiel für den ersten Typ. Dieser Ausdruck verwendet den=
-Operator, um dem Variablenx
den Wert sieben zuzuweisen. Der Ausdruck selbst wird zu7
ausgewertet.
Der Ausdruck3 + 4
ist ein Beispiel für den zweiten Typ. Dieser Ausdruck verwendet den+
-Operator, um3
und4
zusammenzuzählen und einen Wert,7
, zu erzeugen. Wenn er jedoch nicht Teil eines größeren Konstrukts ist (zum Beispiel eineVariablendeklaration wieconst z = 3 + 4
), wird sein Ergebnis sofort verworfen — dies ist normalerweise ein Programmierfehler, da die Auswertung keine Effekte erzeugt.
Wie die obigen Beispiele auch veranschaulichen, sind alle komplexen Ausdrücke durchOperatoren, wie=
und+
, verbunden. In diesem Abschnitt werden wir die folgenden Operatoren einführen:
- Zuweisungsoperatoren
- Vergleichsoperatoren
- Arithmetische Operatoren
- Bitweise Operatoren
- Logische Operatoren
- BigInt-Operatoren
- Zeichenfolgenoperatoren
- Bedingungsoperator (ternär)
- Komma-Operator
- Unäre Operatoren
- Relationale Operatoren
Diese Operatoren verbinden Operanden entweder gebildet durch höherwertige Operatoren oder eines derGrundausdrücke. Eine vollständige und detaillierte Liste der Operatoren und Ausdrücke ist auch in derReferenz verfügbar.
DiePräzedenz von Operatoren bestimmt die Reihenfolge, in der sie angewendet werden, wenn ein Ausdruck ausgewertet wird. Zum Beispiel:
const x = 1 + 2 * 3;const y = 2 * 3 + 1;
Trotz dass*
und+
in unterschiedlichen Reihenfolgen erscheinen, würden beide Ausdrücke zu7
führen, da*
eine höhere Präzedenz als+
hat, so dass der*
verbundene Ausdruck immer zuerst ausgewertet wird. Sie können die Operatorpräzedenz mit Hilfe von Klammern überschreiben (die einenGruppenausdruck erstellen — der Grundeinheit eines Ausdrucks). Um eine vollständige Tabelle der Operatorpräzedenz sowie verschiedene Vorsichtsmaßnahmen zu sehen, besuchen Sie die SeiteOperatorpräzedenzreferenz.
JavaScript hat sowohlbinäre als auchunäre Operatoren und einen speziellen ternären Operator, den bedingten Operator. Ein binärer Operator erfordert zwei Operanden, einen vor dem Operator und einen nach dem Operator:
operand1 operator operand2
Beispielsweise3 + 4
oderx * y
. Diese Form wird alsinfix binärer Operator bezeichnet, da der Operator zwischen zwei Operanden positioniert ist. Alle binären Operatoren in JavaScript sind infix.
Ein unärer Operator erfordert einen einzelnen Operanden, entweder vor oder nach dem Operator:
operator operandoperand operator
Zum Beispiel,x++
oder++x
. Die Formoperator operand
wird alspräfix unärer Operator bezeichnet, und die Formoperand operator
wird alspostfix unärer Operator bezeichnet.++
und--
sind die einzigen Postfix-Operatoren in JavaScript — alle anderen Operatoren, wie!
,typeof
, etc., sind Präfix.
Zuweisungsoperatoren
Ein Zuweisungsoperator weist seinem linken Operanden einen Wert basierend auf dem Wert seines rechten Operanden zu.Der einfache Zuweisungsoperator ist gleich (=
), der den Wert seines rechten Operanden seinem linken Operanden zuweist.Das heißt,x = f()
ist ein Zuweisungsausdruck, der den Wert vonf()
zux
zuweist.
Es gibt auch zusammengesetzte Zuweisungsoperatoren, die eine Kurzschrift für die in der folgenden Tabelle aufgelisteten Operationen sind:
Name | Kurzschriftoperator | Bedeutung |
---|---|---|
Zuweisung | x = f() | x = f() |
Additionszuweisung | x += f() | x = x + f() |
Subtraktionszuweisung | x -= f() | x = x - f() |
Multiplikationszuweisung | x *= f() | x = x * f() |
Divisionszuweisung | x /= f() | x = x / f() |
Restzuweisung | x %= f() | x = x % f() |
Exponentialzuweisung | x **= f() | x = x ** f() |
Linksverschiebungszuweisung | x <<= f() | x = x << f() |
Rechtsverschiebungszuweisung | x >>= f() | x = x >> f() |
Unsigned-Rechtsverschiebungszuweisung | x >>>= f() | x = x >>> f() |
Bitweises UND zuweisen | x &= f() | x = x & f() |
Bitweisem XOR zuzuweisen | x ^= f() | x = x ^ f() |
Bitweisem ODER zuzuweisen | x |= f() | x = x | f() |
Logischem UND zuzuweisen | x &&= f() | x && (x = f()) |
Logischem ODER zuzuweisen | x ||= f() | x || (x = f()) |
Nullish-Koaleszenzzuweisung | x ??= f() | x ?? (x = f()) |
Zuweisung zu Eigenschaften
Wenn ein Ausdruck zu einemObjekt ausgewertet wird, dann kann die linke Seite eines Zuweisungsausdrucks Zuweisungen zu den Eigenschaften dieses Ausdrucks machen.Zum Beispiel:
const obj = {};obj.x = 3;console.log(obj.x); // Prints 3.console.log(obj); // Prints { x: 3 }.const key = "y";obj[key] = 5;console.log(obj[key]); // Prints 5.console.log(obj); // Prints { x: 3, y: 5 }.
Weitere Informationen zu Objekten finden Sie unterArbeiten mit Objekten.
Wenn ein Ausdruck nicht zu einem Objekt ausgewertet wird, dann weisen Zuweisungen zu den Eigenschaften dieses Ausdrucks nichts zu:
const val = 0;val.x = 3;console.log(val.x); // Prints undefined.console.log(val); // Prints 0.
Imstrengen Modus wirft der obige Code einen Fehler, weil man keine Eigenschaften zu Primitiven zuweisen kann.
Es ist ein Fehler, Werte zu unveränderlichen Eigenschaften zuzuwiesen oder zu Eigenschaften eines Ausdrucks ohne Eigenschaften (null
oderundefined
).
Destrukturierung
Für komplexere Zuweisungen ist dieDestrukturierung eine JavaScript-Ausdruckssyntax, die es ermöglicht, Daten aus Arrays oder Objekten mithilfe einer Syntax zu extrahieren, die der Konstruktion von Array- undObjektliteralien ähnelt.
Ohne Destrukturierung erfordert es mehrere Anweisungen, um Werte aus Arrays und Objekten zu extrahieren:
const foo = ["one", "two", "three"];const one = foo[0];const two = foo[1];const three = foo[2];
Mit Destrukturierung können Sie mehrere Werte in verschiedene Variablen mit einer einzigen Anweisung extrahieren:
const [one, two, three] = foo;
Auswertung und Verschachtelung
Im Allgemeinen werden Zuweisungen innerhalb einer Variablendeklaration verwendet (d.h. mitconst
,let
odervar
) oder als eigenständige Anweisungen.
// Declares a variable x and initializes it to the result of f().// The result of the x = f() assignment expression is discarded.let x = f();x = g(); // Reassigns the variable x to the result of g().
Da jedoch, wie andere Ausdrücke, auch Zuweisungsausdrücke wiex = f()
in einen Ergebniswert ausgewertet werden.Obwohl dieser Ergebniswert normalerweise nicht verwendet wird, kann er dann von einem anderen Ausdruck verwendet werden.
Durch das Verketten von Zuweisungen oder das Verschachteln von Zuweisungen in anderen Ausdrücken können überraschende Verhaltensweisen entstehen.Aus diesem Grundraten einige JavaScript-Stilrichtlinien das Verketten oder Verschachteln von Zuweisungen ab.Trotzdem können manchmal Verkettung und Verschachtelung von Zuweisungen auftreten, daher ist es wichtig, zu verstehen, wie sie funktionieren.
Durch das Verketten oder Verschachteln eines Zuweisungsausdrucks kann das Ergebnis selbst einer anderen Variablen zugewiesen werden.Es kann protokolliert, in ein Array-Literal oder einen Funktionsaufruf eingefügt und so weiter getan werden.
let x;const y = (x = f()); // Or equivalently: const y = x = f();console.log(y); // Logs the return value of the assignment x = f().console.log(x = f()); // Logs the return value directly.// An assignment expression can be nested in any place// where expressions are generally allowed,// such as array literals' elements or as function calls' arguments.console.log([0, x = f(), 0]);console.log(f(0, x = f(), 0));
Das Auswertungsergebnis stimmt mit dem im Ausdruck rechts vom Gleichheitszeichen in der Spalte "Bedeutung" der obigen Tabelle überein. Das bedeutet, dassx = f()
zum Ergebnis vonf()
ausgewertet wird,x += f()
sich in die sich ergebende Summex + f()
auswertet,x **= f()
in die sich ergebende Potenzx ** f()
und so weiter.
Im Fall von logischen Zuweisungen werdenx &&= f()
,x \|\|= f()
undx ??= f()
der Rückgabewert der logischen Operation ohne die Zuweisung, alsox && f()
,x \|\| f()
, undx ?? f()
, je nachdem.
Beim Verkettung dieser Ausdrücke ohne Klammern oder andere Gruppierungsoperatoren, wie Array-Literale, werden die Zuweisungsausdrückevon rechts nach links gruppiert (sie sindrechtsassoziativ), abervon links nach rechts ausgewertet.
Beachten Sie, dass bei allen anderen Zuweisungsoperatoren als=
selbst die Ergebnisse immer auf den Werten der Operanden basieren,bevor die Operation durchgeführt wird.
Zum Beispiel, nehmen wir an, dass die folgenden Funktionenf
undg
und die Variablenx
undy
deklariert wurden:
function f() { console.log("F!"); return 2;}function g() { console.log("G!"); return 3;}let x, y;
Betrachten Sie diese drei Beispiele:
y = x = f();y = [f(), x = g()];x[f()] = g();
Auswertungsbeispiel 1
y = x = f()
ist gleichwertig mity = (x = f())
, weil der Zuweisungsoperator=
rechtsassoziativ ist. Es wird jedoch von links nach rechts ausgewertet:
- Der Zuweisungsausdruck
y = x = f()
beginnt ausgewertet zu werden.- Das
y
auf der linken Seite dieser Zuweisung wird in einen Verweis auf die Variableny
ausgewertet. - Der Zuweisungsausdruck
x = f()
beginnt ausgewertet zu werden.- Das
x
auf der linken Seite dieser Zuweisung wird in einen Verweis auf die Variablenx
ausgewertet. - Der Funktionsaufruf
f()
druckt "F!" auf die Konsole und wird dann in die Zahl2
ausgewertet. - Dieses
2
-Ergebnis vonf()
wirdx
zugewiesen.
- Das
- Der Zuweisungsausdruck
x = f()
hat nun die Auswertung abgeschlossen; sein Ergebnis ist der neue Wert vonx
, der2
ist. - Dieses
2
-Ergebnis wird wiederum auchy
zugewiesen.
- Das
- Der Zuweisungsausdruck
y = x = f()
hat nun die Auswertung abgeschlossen; sein Ergebnis ist der neue Wert vony
– der zufällig2
ist.x
undy
werden auf2
gesetzt, und die Konsole hat "F!" gedruckt.
Auswertungsbeispiel 2
y = [f(), x = g()]
wird ebenfalls von links nach rechts ausgewertet:
- Der Zuweisungsausdruck
y = [f(), x = g()]
beginnt ausgewertet zu werden.- Das
y
auf der linken Seite dieser Zuweisung wird in einen Verweis auf die Variableny
ausgewertet. - Das innere Array-Literal
[f(), x = g()]
beginnt ausgewertet zu werden.- Der Funktionsaufruf
f()
druckt "F!" auf die Konsole und wird dann in die Zahl2
ausgewertet. - Der Zuweisungsausdruck
x = g()
beginnt ausgewertet zu werden.- Das
x
auf der linken Seite dieser Zuweisung wird in einen Verweis auf die Variablenx
ausgewertet. - Der Funktionsaufruf
g()
druckt "G!" auf die Konsole und wird dann in die Zahl3
ausgewertet. - Dieses
3
-Ergebnis vong()
wirdx
zugewiesen.
- Das
- Der Zuweisungsausdruck
x = g()
hat nun die Auswertung abgeschlossen; sein Ergebnis ist der neue Wert vonx
, der3
ist. Dieses3
-Ergebnis wird das nächste Element im inneren Array-Literal (nach dem2
vonf()
).
- Der Funktionsaufruf
- Das innere Array-Literal
[f(), x = g()]
hat nun die Auswertung abgeschlossen; sein Ergebnis ist ein Array mit zwei Werten:[2, 3]
. - Dieses
[2, 3]
-Array wird nuny
zugewiesen.
- Das
- Der Zuweisungsausdruck
y = [f(), x = g()]
hat nun die Auswertung abgeschlossen; sein Ergebnis ist der neue Wert vony
– der zufällig[2, 3]
ist.x
ist nun auf3
gesetzt,y
ist nun auf[2, 3]
gesetzt, und die Konsole hat zuerst "F!" und dann "G!" gedruckt.
Auswertungsbeispiel 3
x[f()] = g()
wird ebenfalls von links nach rechts ausgewertet.(Dieses Beispiel setzt voraus, dassx
bereits einem Objekt zugeordnet ist. Weitere Informationen zu Objekten finden Sie unterArbeiten mit Objekten.)
- Der Zuweisungsausdruck
x[f()] = g()
beginnt ausgewertet zu werden.- Der
x[f()]
-Eigenschaftszugriff auf der linken Seite dieser Zuweisung beginnt ausgewertet zu werden.- Das
x
in diesem Eigenschaftszugriff wird in einen Verweis auf die Variablenx
ausgewertet. - Dann druckt der Funktionsaufruf
f()
"F!" auf die Konsole und wird in die Zahl2
ausgewertet.
- Das
- Der
x[f()]
-Eigenschaftszugriff auf dieser Zuweisung hat nun die Auswertung abgeschlossen; sein Ergebnis ist ein Variableneigenschaftsverweis:x[2]
. - Dann druckt der Funktionsaufruf
g()
"G!" auf die Konsole und wird in die Zahl3
ausgewertet. - Dieses
3
wird jetztx[2]
zugewiesen. (Dieser Schritt wird nur erfolgreich sein, wennx
einemObjekt zugewiesen ist.)
- Der
- Der Zuweisungsausdruck
x[f()] = g()
hat nun die Auswertung abgeschlossen; sein Ergebnis ist der neue Wert vonx[2]
– der zufällig3
ist.x[2]
ist jetzt auf3
festgelegt, und die Konsole hat zuerst "F!" und dann "G!" gedruckt.
Vermeidung von Zuweisungsketten
Das Verketten von Zuweisungen oder das Verschachteln von Zuweisungen in anderen Ausdrücken kann zu überraschendem Verhalten führen. Aus diesem Grund wirddas Verketten von Zuweisungen in derselben Anweisung abgeraten.
Insbesondere das Einfügen eines Variablenketten in eineconst
,let
, odervar
Anweisung funktioniert oftnicht. Nur die äußerste/linksste Variabel wird deklariert; andere Variablen innerhalb der Zuweisungskette werden von derconst
/let
/var
-Anweisungnicht deklariert.
Zum Beispiel:
const z = y = x = f();
Diese Anweisung deklariert scheinbar die Variablenx
,y
, undz
.Es deklariert jedoch tatsächlich nur die Variablez
.y
undx
sind entweder ungültige Verweise auf nicht vorhandene Variablen (imstrengen Modus) oder, noch schlimmer, würden implizitglobale Variablen fürx
undy
imschluderhaften Modus erstellen.
Vergleichsoperatoren
Ein Vergleichsoperator vergleicht seine Operanden und gibt einen logischen Wert basierend darauf zurück, ob der Vergleich wahr ist.Die Operanden können numerische, Zeichenfolgen, logische oderobjektartige Werte sein.Zeichenfolgen werden basierend auf der Standardlexikographie geordnet, wobei Unicode-Werte verwendet werden.In den meisten Fällen, wenn die beiden Operanden nicht vom gleichen Typ sind, versucht JavaScript, sie in einen passenden Typ für den Vergleich zu konvertieren.Dieses Verhalten führt im Allgemeinen dazu, dass die Operanden numerisch verglichen werden.Die einzigen Ausnahmen bei der Typkonvertierung innerhalb der Vergleiche betreffen die===
und!==
Operatoren, die eine strenge Gleichheits- und Ungleichheitsprüfung durchführen.Diese Operatoren versuchen nicht, die Operanden vor dem Gleichheitsprüfung in kompatible Typen zu konvertieren.Die folgende Tabelle beschreibt die Vergleichsoperatoren im Kontext dieses Beispielcodes:
const var1 = 3;const var2 = 4;
Operator | Beschreibung | Beispiele, die wahr zurückgeben |
---|---|---|
Gleich (== ) | Gibttrue zurück, wenn die Operanden gleich sind. | 3 == var1
3 == '3' |
Ungleich (!= ) | Gibttrue zurück, wenn die Operanden nicht gleich sind. | var1 != 4 |
Streng gleich (=== ) | Gibttrue zurück, wenn die Operanden gleich und vom gleichen Typ sind. Siehe auchObject.is undGleichheit in JS. | 3 === var1 |
Streng ungleich (!== ) | Gibttrue zurück, wenn die Operanden vom gleichen Typ, aber nicht gleich sind, oder einen verschiedenen Typ haben. | var1 !== "3" |
Größer als (> ) | Gibttrue zurück, wenn der linke Operand größer als der rechte Operand ist. | var2 > var1 |
Größer als oder gleich (>= ) | Gibttrue zurück, wenn der linke Operand größer oder gleich dem rechten Operand ist. | var2 >= var1 |
Kleiner als (< ) | Gibttrue zurück, wenn der linke Operand kleiner als der rechte Operand ist. | var1 < var2 |
Kleiner als oder gleich (<= ) | Gibttrue zurück, wenn der linke Operand kleiner oder gleich dem rechten Operand ist. | var1 <= var2 |
Hinweis:=>
ist kein Vergleichsoperator, sondern die NotationfürArrow-Funktionen.
Arithmetische Operatoren
Ein arithmetischer Operator nimmt numerische Werte (entweder Literale oder Variablen) als seine Operanden und gibt einen einzelnen numerischen Wert zurück.Die Standard-Arithmetik-Operatoren sind Addition (+
), Subtraktion (-
), Multiplikation (*
) und Division (/
).Diese Operatoren funktionieren, wie sie es in den meisten anderen Programmiersprachen tun, wenn sie mit Gleitkommazahlen verwendet werden (insbesondere beachten Sie, dass die Division durch NullInfinity
erzeugt). Zum Beispiel:
1 / 2; // 0.51 / 2 === 1.0 / 2.0; // this is true
Zusätzlich zu den Standard-Arithmetik-Operationen (+
,-
,*
,/
) bietet JavaScript die in der folgenden Tabelle aufgelisteten Arithmetik-Operatoren:
Operator | Beschreibung | Beispiel |
---|---|---|
Rest (% ) | Binärer Operator. Gibt den ganzzahligen Rest der Teilung der beiden Operanden zurück. | 12 % 5 gibt 2 zurück. |
Inkrement (++ ) | Unärer Operator. Addiert eins zu seinem Operanden. Wenn als Präfix-Operator verwendet (++x ), gibt er den Wert seines Operanden nach dem Hinzufügen von eins zurück; wenn er als Postfix-Operator verwendet wird (x++ ), gibt er den Wert seines Operanden vor dem Hinzufügen von eins zurück. | Wennx 3 ist, dann setzt++x x auf 4 und gibt 4 zurück; hingegen gibtx++ 3 zurück und setzt dannx auf 4. |
Dekrement (-- ) | Unärer Operator. Subtrahiert eins von seinem Operanden. Der Rückgabewert entspricht dem des Inkrement-Operators. | Wennx 3 ist, dann setzt--x x auf 2 und gibt 2 zurück; hingegen gibtx-- 3 zurück und setzt dannx auf 2. |
Unäre Negation (- ) | Unärer Operator. Gibt die Negation seines Operanden zurück. | Wennx 3 ist, gibt-x -3 zurück. |
Unäres Plus (+ ) | Unärer Operator. Versucht, den Operanden in eine Zahl zu konvertieren, falls er es noch nicht ist. |
|
Exponentiationsoperator (** ) | Berechnet dieBasis zurExponent Potenz, das heißt,Basis^Exponent . | 2 ** 3 gibt8 zurück.10 ** -1 gibt0.1 zurück. |
Bitweise Operatoren
Ein bitweiser Operator behandelt seine Operanden als eine Menge von 32 Bits (Nullen und Einsen) und nicht als Dezimal-, Hexadezimal- oder Oktalzahlen. Zum Beispiel hat die Dezimalzahl neun eine binäre Darstellung von 1001. Bitweise Operatoren führen ihre Operationen auf solchen binären Darstellungen durch, geben aber standardmäßige JavaScript-numerische Werte zurück.
Die folgende Tabelle fasst die bitweisen Operatoren von JavaScript zusammen.
Operator | Verwendung | Beschreibung |
---|---|---|
Bitweises UND | a & b | Gibt eine Eins in jeder Bitposition zurück, für die die entsprechenden Bits beider Operanden Einsen sind. |
Bitweises ODER | a | b | Gibt eine Null in jeder Bitposition zurück, für die die entsprechenden Bits beider Operanden Nullen sind. |
Bitweises XOR | a ^ b | Gibt eine Null in jeder Bitposition zurück, für die die entsprechenden Bits gleich sind. [Gibt eine Eins in jeder Bitposition zurück, für die die entsprechenden Bits unterschiedlich sind.] |
Bitweises NICHT | ~ a | Invertiert die Bits seines Operanden. |
Linksverschiebung | a << b | Verschiebta in der binären Darstellungb Bits nach links und schiebt Nullen von rechts ein. |
Sign-weitergebende Rechtsverschiebung | a >> b | Verschiebta in der binären Darstellungb Bits nach rechts und verwirft nach rechts verschobene Bits. |
Null-auffüllende Rechtsverschiebung | a >>> b | Verschiebta in der binären Darstellungb Bits nach rechts, verwirft nach rechts verschobene Bits und schiebt Nullen von links ein. |
Bitweise logische Operatoren
Konzepte, die die bitweisen logischen Operatoren umfassen, funktionieren wie folgt:
Die Operanden werden in zweiunddreißig-Bit-Ganzzahlen umgewandelt und werden durch eine Reihe von Bits (Nullen und Einsen) ausgedrückt. Zahlen mit mehr als 32 Bits verlieren ihre am meisten signifikanten Bits. Zum Beispiel wird die folgende Ganzzahl mit mehr als 32 Bit in eine 32-Bit-Ganzzahl umgewandelt:
Before: 1110 0110 1111 1010 0000 0000 0000 0110 0000 0000 0001After: 1010 0000 0000 0000 0110 0000 0000 0001
Jedes Bit im ersten Operanden wird mit dem entsprechenden Bit im zweiten Operanden gepaart: erstes Bit zu erstem Bit, zweites Bit zu zweitem Bit und so weiter.
Der Operator wird auf jedes Bitpaar angewendet, und das Ergebnis wird bitweise konstruiert.
Zum Beispiel ist die binäre Darstellung von neun 1001 und die binäre Darstellung von fünfzehn ist 1111. Wenn die bitweisen Operatoren auf diese Werte angewendet werden, sind die Ergebnisse wie folgt:
Ausdruck | Ergebnis | Binäre Beschreibung |
---|---|---|
15 & 9 | 9 | 1111 & 1001 = 1001 |
15 | 9 | 15 | 1111 | 1001 = 1111 |
15 ^ 9 | 6 | 1111 ^ 1001 = 0110 |
~15 | -16 | ~ 0000 0000 … 0000 1111 = 1111 1111 … 1111 0000 |
~9 | -10 | ~ 0000 0000 … 0000 1001 = 1111 1111 … 1111 0110 |
Beachten Sie, dass alle 32 Bits mit dem Bitweisen NICHT Operator invertiert werden, und dass Werte mit dem am meisten signifikanten (links darstellenden) Bit, das auf 1 gesetzt ist, negative Zahlen darstellen (Zweierkomplementdarstellung).~x
wird in denselben Wert ausgewertet, den-x - 1
ergibt.
Bitweise Verschiebeoperatoren
Die bitweisen Verschiebeoperatoren nehmen zwei Operanden: Der erste ist eine zu verschiebende Menge, und die zweite gibt die Anzahl der Bits an, um die der erste Operand verschoben werden soll. Die Richtung des Verschiebevorgangs wird durch den verwendeten Operator gesteuert.
Verschiebeoperatoren konvertieren ihre Operanden in zweiunddreißig-Bit-Ganzzahlen und liefern ein Ergebnis entweder des TypsNumber
oderBigInt
: insbesondere, wenn der Typ des linken OperandenBigInt
ist, geben sieBigInt
zurück; andernfalls geben sieNumber
zurück.
Die Verschiebeoperatoren sind in der folgenden Tabelle aufgeführt.
Operator | Beschreibung | Beispiel |
---|---|---|
Linksverschiebung ( << ) | Dieser Operator verschiebt den ersten Operanden um die angegebene Anzahl von Bits nach links. Überzählige Bits, die nach links verschoben werden, werden verworfen. Null-Bits werden von rechts eingeschoben. | 9<<2 ergibt 36, weil 1001 um 2 Bits nach links verschoben wird und zu 100100 wird, was 36 ist. |
Sign-weitergebende Rechtsverschiebung (>> ) | Dieser Operator verschiebt den ersten Operanden um die angegebene Anzahl von Bits nach rechts. Überzählige Bits, die nach rechts verschoben werden, werden verworfen. Kopien des am linksten stehenden Bits, werden von links eingeschoben. | 9>>2 ergibt 2, weil 1001 um 2 Bits nach rechts verschoben und zu 10 wird, was 2 ist. Ebenso ergibt-9>>2 -3, da das Vorzeichen erhalten bleibt. |
Null-auffüllende Rechtsverschiebung (>>> ) | Dieser Operator verschiebt den ersten Operanden um die angegebene Anzahl von Bits nach rechts. Überzählige Bits, die nach rechts verschoben werden, werden verworfen. Null-Bits werden von links eingeschoben. | 19>>>2 ergibt 4, weil 10011 um 2 Bits nach rechts verschoben wird und zu 100 wird, was 4 ist. Für nicht-negative Zahlen ergeben null-auffüllende Rechtsverschiebungen und sign-weitergebende Rechtsverschiebungen dasselbe Ergebnis. |
Logische Operatoren
Logische Operatoren werden normalerweise mit Booleschen Werten verwendet; wenn sie es tun, geben sie einen Booleschen Wert zurück. Die Operatoren&&
,||
und??
geben tatsächlich den Wert eines ihrer angegebenen Operanden zurück. Wenn diese Operatoren mit nicht-booleschen Werten verwendet werden, können sie einen nicht-booleschen Wert zurückgeben. Als solche sind sie treffender als "Wertauswahloperatoren" bezeichnet. Die logischen Operatoren sind in der folgenden Tabelle beschrieben.
Operator | Verwendung | Beschreibung |
---|---|---|
Logisches UND (&& ) | expr1 && expr2 | Gibtexpr1 zurück, wenn es infalse konvertiert werden kann; andernfalls gibt esexpr2 zurück. Wenn beide Operanden true sind, gibtexpr1 && expr2 true zurück; ansonstenfalse . |
Logisches ODER (|| ) | expr1 || expr2 | Gibtexpr1 zurück, wenn es intrue konvertiert werden kann; andernfalls gibt esexpr2 zurück. Somit gibt|| true zurück, wenn einer der beiden Operanden true ist, undfalse , wenn beide false sind. |
Nullish coalescing operator (?? ) | expr1 ?? expr2 | Gibtexpr1 zurück, wenn es wedernull nochundefined ist; ansonsten gibt esexpr2 zurück. |
Logisches NICHT (! ) | !expr | Gibtfalse zurück, wenn sein einzelner Operand intrue konvertiert werden kann; ansonstentrue . |
Beispiele für Ausdrücke, die infalse
konvertiert werden können, sind solche, die zunull
,0
,0n
,NaN
, der leeren Zeichenfolge (""
) oderundefined
ausgewertet werden.
Der folgende Code zeigt Beispiele des&&
-Operators (logisches UND).
const a1 = true && true; // t && t returns trueconst a2 = true && false; // t && f returns falseconst a3 = false && true; // f && t returns falseconst a4 = false && 3 === 4; // f && f returns falseconst a5 = "Cat" && "Dog"; // t && t returns Dogconst a6 = false && "Cat"; // f && t returns falseconst a7 = "Cat" && false; // t && f returns false
Der folgende Code zeigt Beispiele des||
-Operators (logisches ODER).
const o1 = true || true; // t || t returns trueconst o2 = false || true; // f || t returns trueconst o3 = true || false; // t || f returns trueconst o4 = false || 3 === 4; // f || f returns falseconst o5 = "Cat" || "Dog"; // t || t returns Catconst o6 = false || "Cat"; // f || t returns Catconst o7 = "Cat" || false; // t || f returns Cat
Der folgende Code zeigt Beispiele des??
-Operators (nullish coalescing).
const n1 = null ?? 1; // 1const n2 = undefined ?? 2; // 2const n3 = false ?? 3; // falseconst n4 = 0 ?? 4; // 0
Beachten Sie, wie??
wie||
funktioniert, aber es gibt den zweiten Ausdruck nur dann zurück, wenn der erste "nullish" ist, d.h.null
oderundefined
.??
ist eine bessere Alternative als||
für das Setzen von Standardwerten für Werte, die möglicherweisenull
oderundefined
sind, insbesondere wenn Werte wie''
oder0
gültige Werte sind und der Standardwert nicht anwendbar ist.
Der folgende Code zeigt Beispiele des!
-Operators (logisches NICHT).
const n1 = !true; // !t returns falseconst n2 = !false; // !f returns trueconst n3 = !"Cat"; // !t returns false
Kurzschlussauswertung
Da logische Ausdrücke von links nach rechts ausgewertet werden, werden sie auf mögliche "Kurzschluss"-Auswertung unter den folgenden Regeln getestet:
falsy && anything
wird auf den falsy Wert evaluiert.truthy || anything
wird auf den truthy Wert evaluiert.nonNullish ?? anything
wird auf den nicht-nullish Wert evaluiert.
Die Logikregeln garantieren, dass diese Auswertungen immer korrekt sind. Beachten Sie, dass deranything Teil der obigen Ausdrücke nicht ausgewertet wird, so dass die Nebenwirkungen des Ausführens nicht zum Tragen kommen.
BigInt-Operatoren
Die meisten Operatoren, die zwischen Zahlen verwendet werden können, können auch zwischenBigInt
Werten verwendet werden.
// BigInt additionconst a = 1n + 2n; // 3n// Division with BigInts round towards zeroconst b = 1n / 2n; // 0n// Bitwise operations with BigInts do not truncate either sideconst c = 40000000000000000n >> 2n; // 10000000000000000n
Eine Ausnahme istunsigned right shift (>>>
), die für BigInt-Werte nicht definiert ist. Dies liegt daran, dass ein BigInt keine feste Breite hat und technisch gesehen keine "höchste Bit" hat.
const d = 8n >>> 2n; // TypeError: BigInts have no unsigned right shift, use >> instead
BigInts und Zahlen sind nicht austauschbar — Sie können sie nicht in Berechnungen mischen.
const a = 1n + 2; // TypeError: Cannot mix BigInt and other types
Das liegt daran, dass BigInt weder eine Teilmenge noch eine Obermenge von Zahlen ist. BigInts haben eine höhere Genauigkeit als Zahlen, wenn es um große ganze Zahlen geht, aber sie können keine Dezimalzahlen darstellen, sodass durch eine automatische Konvertierung auf beiden Seiten Genauigkeit verloren gehen könnte. Verwenden Sie eine explizite Konvertierung, um anzuzeigen, ob die Operation eine Zahl-Operation oder eine BigInt-Operation sein soll.
const a = Number(1n) + 2; // 3const b = 1n + BigInt(2); // 3n
Sie können BigInts mit Zahlen vergleichen.
const a = 1n > 2; // falseconst b = 3 > 2n; // true
Zeichenfolgenoperatoren
Zusätzlich zu den Vergleichsoperatoren, die auf Zeichenfolgenwerte angewendet werden können, fügt der Konkatenationsoperator (+) zwei Zeichenfolgenwerte zusammen und gibt eine weitere Zeichenfolge zurück, die die Vereinigung der beiden Operanden-Zeichenfolgen ist.
Zum Beispiel,
console.log("my " + "string"); // console logs the string "my string".
Der Kurzzuweisungsoperator+=
kann auch verwendet werden, um Zeichenfolgen zu concatenieren.
Zum Beispiel,
let myString = "alpha";myString += "bet"; // evaluates to "alphabet" and assigns this value to myString.
Bedingungsoperator (ternär)
DerBedingungsoperator ist der einzige JavaScript-Operator, der drei Operanden benötigt. Der Operator kann, basierend auf einer Bedingung, einen von zwei Werten annehmen. Die Syntax lautet:
condition ? val1 : val2
Wenncondition
wahr ist, hat der Operator den Wert vonval1
. Andernfalls hat er den Wert vonval2
. Sie können den Bedingungsoperator überall verwenden, wo Sie auch einen Standardoperator verwenden würden.
Zum Beispiel,
const status = age >= 18 ? "adult" : "minor";
Dieser Ausdruck weist der Variablenstatus
den Wert "adult" zu, wennage
achtzehn oder mehr ist. Andernfalls weist es den Wert "minor"status
zu.
Komma-Operator
DerKomma-Operator (,
) wertet beide seiner Operanden aus und gibt den Wert des letzten Operanden zurück. Dieser Operator wird in erster Linie in einerfor
-Schleife verwendet, um mehrere Variablen bei jedem Durchlauf der Schleife zu aktualisieren. Es wird als schlechter Stil angesehen, ihn anderswo zu verwenden, wenn es nicht notwendig ist. Oft können und sollten zwei separate Anweisungen anstelle dessen verwendet werden.
Zum Beispiel, wenna
ein zweidimensionales Array mit 10 Elementen an einer Seite ist, verwendet der folgende Code den Komma-Operator, um zwei Variablen gleichzeitig zu aktualisieren. Der Code druckt die Werte der diagonalen Elemente im Array:
const x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];const a = [x, x, x, x, x];for (let i = 0, j = 9; i <= j; i++, j--) { // ^ console.log(`a[${i}][${j}]= ${a[i][j]}`);}
Unäre Operatoren
Ein unäres Operator ist eine Operation mit nur einem Operanden.
delete
Derdelete
Operator löscht die Eigenschaft eines Objekts. Die Syntax lautet:
delete object.property;delete object[propertyKey];delete objectName[index];
wobeiobject
der Name eines Objekts ist,property
eine vorhandene Eigenschaft ist undpropertyKey
eine Zeichenfolge oder ein Symbol ist, das eine vorhandene Eigenschaft bezeichnet.
Wenn derdelete
-Operator erfolgreich ist, entfernt er die Eigenschaft aus dem Objekt. Ein nachfolgender Zugriff darauf gibtundefined
zurück. Derdelete
-Operator gibttrue
zurück, wenn die Operation möglich ist; er gibtfalse
zurück, wenn die Operation nicht möglich ist.
delete Math.PI; // returns false (cannot delete non-configurable properties)const myObj = { h: 4 };delete myObj.h; // returns true (can delete user-defined properties)
Löschen von Array-Elementen
Da Arrays nur Objekte sind, ist es technisch möglich, Elemente aus ihnen zulöschen
. Dies wird jedoch als schlechte Praxis angesehen - versuchen Sie, es zu vermeiden. Wenn Sie eine Array-Eigenschaft löschen, wird die Array-Länge nicht beeinflusst und andere Elemente werden nicht neu indiziert. Um dieses Verhalten zu erreichen, ist es viel besser, das Element durch den Wertundefined
zu überschreiben. Um tatsächlich das Array zu manipulieren, verwenden Sie die verschiedenen Array-Methoden wiesplice
.
typeof
Dertypeof
operator gibt eine Zeichenkette zurück, die den Typ des nicht ausgewerteten Operanden angibt.operand
ist die Zeichenfolge, Variable, das Schlüsselwort oder Objekt, für das der Typ zurückgegeben werden soll. Die Klammern sind optional.
Angenommen, Sie definieren die folgenden Variablen:
const myFun = () => 5 + 2;const shape = "round";const size = 1;const foo = ["Apple", "Mango", "Orange"];const today = new Date();
Dertypeof
-Operator gibt die folgenden Ergebnisse für diese Variablen zurück:
typeof myFun; // returns "function"typeof shape; // returns "string"typeof size; // returns "number"typeof foo; // returns "object"typeof today; // returns "object"typeof doesntExist; // returns "undefined"
Für die Schlüsselwörtertrue
undnull
gibt dertypeof
Operator die folgenden Ergebnisse zurück:
typeof true; // returns "boolean"typeof null; // returns "object"
Für eine Zahl oder Zeichenfolge gibt dertypeof
Operator die folgenden Ergebnisse zurück:
typeof 62; // returns "number"typeof "Hello world"; // returns "string"
Für Eigenschaftswerte gibt dertypeof
Operator den Typ des Wertes zurück, den die Eigenschaft enthält:
typeof document.lastModified; // returns "string"typeof window.length; // returns "number"typeof Math.LN2; // returns "number"
Für Methoden und Funktionen gibt dertypeof
Operator folgende Ergebnisse zurück:
typeof blur; // returns "function"typeof parseInt; // returns "function"typeof shape.split; // returns "function"
Für vordefinierte Objekte gibt dertypeof
Operator folgende Ergebnisse zurück:
typeof Date; // returns "function"typeof Function; // returns "function"typeof Math; // returns "object"typeof Option; // returns "function"typeof String; // returns "function"
void
Dervoid
operator gibt einen Ausdruck an, der ausgewertet wird, ohne einen Wert zurückzugeben.expression
ist ein JavaScript-Ausdruck, der ausgewertet werden soll. Die Klammern, die den Ausdruck umgeben, sind optional, aber es ist ein guter Stil, sie zu verwenden, um Präzedenzprobleme zu vermeiden.
Relationale Operatoren
Ein relationaler Operator vergleicht seine Operanden und gibt einen Booleschen Wert basierend darauf zurück, ob der Vergleich wahr ist.
in
Derin
operator gibttrue
zurück, wenn die angegebene Eigenschaft im angegebenen Objekt vorhanden ist. Die Syntax lautet:
propNameOrNumber in objectName
wobeipropNameOrNumber
ein Zeichenfolgen-, numerischer oder Symbole-Ausdruck ist, der einen Eigenschaftsnamen oder Array-Index darstellt, undobjectName
der Name eines Objekts ist.
Die folgenden Beispiele zeigen einige Verwendungen desin
-Operators.
// Arraysconst trees = ["redwood", "bay", "cedar", "oak", "maple"];0 in trees; // returns true3 in trees; // returns true6 in trees; // returns false"bay" in trees; // returns false// (you must specify the index number, not the value at that index)"length" in trees; // returns true (length is an Array property)// built-in objects"PI" in Math; // returns trueconst myString = new String("coral");"length" in myString; // returns true// Custom objectsconst myCar = { make: "Honda", model: "Accord", year: 1998 };"make" in myCar; // returns true"model" in myCar; // returns true
instanceof
Derinstanceof
operator gibttrue
zurück, wenn das angegebene Objekt vom angegebenen Objekttyp ist. Die Syntax lautet:
object instanceof objectType
wobeiobject
das Objekt ist, das gegen denobjectType
getestet werden soll, undobjectType
ein Konstruktor ist, der einen Typ darstellt, wieMap
oderArray
.
Verwenden Sieinstanceof
, wenn Sie den Typ eines Objekts zur Laufzeit bestätigen müssen. Zum Beispiel, wenn Sie Ausnahmen abfangen, können Sie je nach Art der ausgelösten Ausnahme in unterschiedliche Ausnahmebehandlungscodes wechseln.
Zum Beispiel verwendet der folgende Codeinstanceof
, um zu bestimmen, obobj
einMap
-Objekt ist. Daobj
einMap
-Objekt ist, werden die Anweisungen innerhalb desif
-Blocks ausgeführt.
const obj = new Map();if (obj instanceof Map) { // statements to execute}
Grundlegende Ausdrücke
Alle Operatoren arbeiten schließlich an einem oder mehreren grundlegenden Ausdrücken. Diese grundlegenden Ausdrücke schließenBezeichner undLiterale ein, aber es gibt noch einige andere Arten. Sie werden unten kurz eingeführt, und ihre Semantik wird ausführlich in den jeweiligen Referenzabschnitten beschrieben.
this
Das Schlüsselwortthis
wird normalerweise innerhalb einer Funktion verwendet. Im Allgemeinen, wenn die Funktion an ein Objekt als Methode angehängt ist, bezieht sichthis
auf das Objekt, auf dem die Methode aufgerufen wird. Es handelt sich um einen Ausdruck, der zum Objekt ausgewertet wird, sodass Sie alle zuvor eingeführten Objektoperationen verwenden können.
this["propertyName"];this.propertyName;doSomething(this);
Zum Beispiel, nehmen wir an, eine Funktion wird wie folgt definiert:
function getFullName() { return `${this.firstName} ${this.lastName}`;}
Wir können diese Funktion nun an ein Objekt anhängen, und es wird die Eigenschaften dieses Objekts verwenden, wenn es aufgerufen wird:
const person1 = { firstName: "Chris", lastName: "Martin",};const person2 = { firstName: "Chester", lastName: "Bennington",};// Attach the same functionperson1.getFullName = getFullName;person2.getFullName = getFullName;console.log(person1.getFullName()); // "Chris Martin"console.log(person2.getFullName()); // "Chester Bennington"
Gruppierungsoperator
Der Gruppierungsoperator( )
steuert die Reihenfolge der Auswertung in Ausdrücken. Zum Beispiel können Sie Multiplikation und Division überschreiben, um zuerst Addition auszuführen.
const a = 1;const b = 2;const c = 3;// default precedencea + b * c; // 7// evaluated by default like thisa + (b * c); // 7// now overriding precedence// addition before multiplication(a + b) * c; // 9// which is equivalent toa * c + b * c; // 9
Eigenschaftszugriff
Die Syntax desEigenschaftszugriffs ruft Eigenschaftswerte von Objekten ab, entweder mit Punktnotation oder Klammernotation.
object.property;object["property"];
Der Leitfaden fürArbeiten mit Objekten geht ausführlicher auf Objekteigenschaften ein.
Optionales Chaining
Dieoptionale Chaining-Syntax (?.
) führt die verkettete Operation auf einem Objekt aus, wenn es definiert und nichtnull
ist, ansonsten wird die Operation abgebrochen undundefined
zurückgegeben. Dies ermöglicht es Ihnen, auf einen Wert zuzugreifen, der möglicherweisenull
oderundefined
ist, ohne einenTypeError
auszulösen.
maybeObject?.property;maybeObject?.[property];maybeFunction?.();
new
Sie können dennew
operator verwenden, um eine Instanz eines benutzerdefinierten Objekttyps oder eines der eingebauten Objekttypen zu erstellen. Verwenden Sienew
wie folgt:
const objectName = new ObjectType(param1, param2, /* …, */ paramN);
super
MDN-Feedback-Box
Diese Seite wurde automatisch aus dem Englischen übersetzt.