+)== vs. ===void-OperatorJavaScript-Operatoren mögen eigenartig erscheinen. Mit den folgenden zwei Regeln sind sie leichter zu verstehen:
Wenn ein Operator Operanden erhält, die nicht die richtigen Typen haben, wirft er selten eine Ausnahme. Stattdessen zwingt er (konvertiert automatisch) die Operanden, damit er mit ihnen arbeiten kann. Betrachten wir zwei Beispiele.
Erstens kann der Multiplikationsoperator nur mit Zahlen arbeiten. Daher konvertiert er Zeichenketten in Zahlen, bevor er sein Ergebnis berechnet.
> '7' * '3'
21Zweitens kann der Klammer-Operator ([ ]) zum Zugriff auf die Eigenschaften eines Objekts nur Zeichenketten und Symbole verarbeiten. Alle anderen Werte werden in Zeichenketten konvertiert.
const obj = {};
obj['true'] = 123;
// Coerce true to the string 'true'
assert.equal(obj[true], 123);Wie bereits erwähnt, funktionieren die meisten Operatoren nur mit primitiven Werten. Wenn ein Operand ein Objekt ist, wird er normalerweise in einen primitiven Wert konvertiert – zum Beispiel:
> [1,2,3] + [4,5,6]
'1,2,34,5,6'Warum? Der Plus-Operator konvertiert seine Operanden zuerst in primitive Werte.
> String([1,2,3])
'1,2,3'
> String([4,5,6])
'4,5,6'Als Nächstes verkettet er die beiden Zeichenketten.
> '1,2,3' + '4,5,6'
'1,2,34,5,6'+)Der Plus-Operator funktioniert in JavaScript wie folgt:
Der Zeichenketten-Modus erlaubt uns, + zum Zusammenfügen von Zeichenketten zu verwenden.
> 'There are ' + 3 + ' items'
'There are 3 items'Der Zahlen-Modus bedeutet, dass, wenn keiner der Operanden eine Zeichenkette ist (oder ein Objekt, das zu einer Zeichenkette wird), alles in Zahlen konvertiert wird.
> 4 + true
5Number(true) ist 1.
Der einfache Zuweisungsoperator wird verwendet, um Speicherorte zu ändern.
x = value; // assign to a previously declared variable
obj.propKey = value; // assign to a property
arr[index] = value; // assign to an Array elementInitialisierer in Variablendeklarationen können ebenfalls als eine Form der Zuweisung betrachtet werden.
const x = value;
let y = value;JavaScript unterstützt die folgenden Zuweisungsoperatoren:
+= -= *= /= %= [ES1]+= kann auch für die Verkettung von Zeichenketten verwendet werden.**= [ES2016]&= ^= |= [ES1]<<= >>= >>>= [ES1]||= &&= ??= [ES2021]Logische Zuweisungsoperatoren funktionieren anders als andere zusammengesetzte Zuweisungsoperatoren.
| Zuweisungsoperator | Entspricht | Weist nur zu, wenn a |
|---|---|---|
a ||= b |
a || (a = b) |
Falsy |
a &&= b |
a && (a = b) |
Truthy |
a ??= b |
a ?? (a = b) |
Nullish |
Warum entspricht a ||= b dem folgenden Ausdruck?
a || (a = b)
Warum nicht diesem Ausdruck?
a = a || b
Der erstere Ausdruck hat den Vorteil des Short-Circuiting: Die Zuweisung wird nur ausgewertet, wenn a zu false ausgewertet wird. Daher wird die Zuweisung nur durchgeführt, wenn sie notwendig ist. Im Gegensatz dazu führt der letztere Ausdruck immer eine Zuweisung durch.
Weitere Informationen zu ??= finden Sie in §14.4.5 „Der Nullish-Coalescing-Zuweisungsoperator (??=) [ES2021]“.
Für Operatoren op außer || && ?? sind die folgenden beiden Zuweisungsarten äquivalent:
myvar op= value
myvar = myvar op value
Wenn beispielsweise op + ist, erhalten wir den Operator +=, der wie folgt funktioniert:
let str = '';
str += '<b>';
str += 'Hello!';
str += '</b>';
assert.equal(str, '<b>Hello!</b>');== vs. ===JavaScript hat zwei Arten von Gleichheitsoperatoren: lose Gleichheit (==) und strikte Gleichheit (===). Die Empfehlung ist, immer letztere zu verwenden.
Andere Namen für
== und ===
== wird auch als double equals bezeichnet. Sein offizieller Name in der Sprachspezifikation ist abstract equality comparison.=== wird auch als triple equals bezeichnet.== und !=)Lose Gleichheit ist eine der Eigenheiten von JavaScript. Sie zwängt Operanden oft. Einige dieser Zwängungen ergeben Sinn.
> '123' == 123
true
> false == 0
trueAndere weniger.
> '' == 0
trueObjekte werden in primitive Werte konvertiert, wenn (und nur wenn!) der andere Operand primitiv ist.
> [1, 2, 3] == '1,2,3'
true
> ['1', '2', '3'] == '1,2,3'
trueWenn beide Operanden Objekte sind, sind sie nur dann gleich, wenn sie dasselbe Objekt sind.
> [1, 2, 3] == ['1', '2', '3']
false
> [1, 2, 3] == [1, 2, 3]
false
> const arr = [1, 2, 3];
> arr == arr
trueSchließlich betrachtet == undefined und null als gleich.
> undefined == null
true=== und !==)Strikte Gleichheit zwängt niemals. Zwei Werte sind nur dann gleich, wenn sie denselben Typ haben. Betrachten wir unsere vorherige Interaktion mit dem ==-Operator und sehen wir, was der ===-Operator tut:
> false === 0
false
> '123' === 123
falseEin Objekt ist nur dann gleich einem anderen Wert, wenn dieser Wert dasselbe Objekt ist.
> [1, 2, 3] === '1,2,3'
false
> ['1', '2', '3'] === '1,2,3'
false
> [1, 2, 3] === ['1', '2', '3']
false
> [1, 2, 3] === [1, 2, 3]
false
> const arr = [1, 2, 3];
> arr === arr
trueDer ===-Operator betrachtet undefined und null nicht als gleich.
> undefined === null
falseIch empfehle, immer === zu verwenden. Es macht Ihren Code leichter verständlich und erspart Ihnen, über die Eigenheiten von == nachdenken zu müssen.
Betrachten wir zwei Anwendungsfälle für == und was ich stattdessen empfehlen würde.
==: Vergleich mit einer Zahl oder einer Zeichenkette== ermöglicht es Ihnen zu prüfen, ob ein Wert x eine Zahl oder diese Zahl als Zeichenkette ist – mit einem einzigen Vergleich.
if (x == 123) {
// x is either 123 or '123'
}Ich bevorzuge eine der folgenden beiden Alternativen:
if (x === 123 || x === '123') ···
if (Number(x) === 123) ···Sie können x auch in eine Zahl konvertieren, wenn Sie sie zum ersten Mal antreffen.
==: Vergleich mit undefined oder nullEin weiterer Anwendungsfall für == ist die Prüfung, ob ein Wert x entweder undefined oder null ist.
if (x == null) {
// x is either null or undefined
}Das Problem mit diesem Code ist, dass man nicht sicher sein kann, ob jemand ihn absichtlich so geschrieben hat oder ob er einen Tippfehler gemacht und === null gemeint hat.
Ich bevorzuge eine der folgenden beiden Alternativen:
if (x === undefined || x === null) ···
if (!x) ···Ein Nachteil der zweiten Alternative ist, dass sie Werte außer undefined und null akzeptiert, aber sie ist ein etabliertes Muster in JavaScript (wird im Detail in §15.3 „Existence Checks basierend auf Truthiness“ erklärt).
Die folgenden drei Bedingungen sind ebenfalls annähernd äquivalent:
if (x != null) ···
if (x !== undefined && x !== null) ···
if (x) ···===: Object.is()Die Methode Object.is() vergleicht zwei Werte.
> Object.is(123, 123)
true
> Object.is(123, '123')
falseSie ist noch strikter als ===. Zum Beispiel betrachtet sie NaN, den Fehlerwert für Berechnungen mit Zahlen, als gleich zu sich selbst.
> Object.is(NaN, NaN)
true
> NaN === NaN
falseDas ist gelegentlich nützlich. Zum Beispiel können Sie sie verwenden, um eine verbesserte Version der Array-Methode .indexOf() zu implementieren.
const myIndexOf = (arr, elem) => {
return arr.findIndex(x => Object.is(x, elem));
};myIndexOf() findet NaN in einem Array, während .indexOf() das nicht tut.
> myIndexOf([0,NaN,2], NaN)
1
> [0,NaN,2].indexOf(NaN)
-1Das Ergebnis -1 bedeutet, dass .indexOf() sein Argument nicht im Array finden konnte.
| Operator | Name |
|---|---|
< |
Kleiner als |
<= |
Kleiner als oder gleich |
> |
Größer als |
>= |
Größer als oder gleich |
JavaScripts Vergleichsoperatoren (Tab. 3) funktionieren sowohl für Zahlen als auch für Zeichenketten.
> 5 >= 2
true
> 'bar' < 'foo'
true<= und >= basieren auf strikter Gleichheit.
Die Vergleichsoperatoren funktionieren schlecht für menschliche Sprachen
Die Vergleichsoperatoren funktionieren schlecht für den Vergleich von Text in einer menschlichen Sprache, z. B. wenn Großschreibung oder Akzente beteiligt sind. Die Details werden in §20.6 „Vergleich von Zeichenketten“ erklärt.
Die folgenden Operatoren werden an anderer Stelle in diesem Buch behandelt:
??) für StandardwerteDie nächsten beiden Unterabschnitte behandeln zwei selten verwendete Operatoren.
Der Komma-Operator hat zwei Operanden, wertet beide aus und gibt den zweiten zurück.
> 'a', 'b'
'b'Weitere Informationen zu diesem Operator finden Sie in Speaking JavaScript.
void-OperatorDer void-Operator wertet seinen Operanden aus und gibt undefined zurück.
> void (3 + 2)
undefinedWeitere Informationen zu diesem Operator finden Sie in Speaking JavaScript.
Quiz
Siehe Quiz-App.