Signatur
Beschreibung
Der Operator ^= kombiniert die bitweise XOR-Operation (^) mit einer Zuweisung in einem einzigen Ausdruck. Der Ausdruck x ^= y ist dabei äquivalent zu x = x ^ y. Das bitweise XOR vergleicht jeden Bit-Platz beider Operanden: Das Ergebnis-Bit ist 1, wenn genau eines der beiden Bits 1 ist, andernfalls 0.
Vor der Operation werden beide Operanden intern in vorzeichenbehaftete 32-Bit-Ganzzahlen (Int32) umgewandelt. Das Ergebnis ist ebenfalls eine 32-Bit-Ganzzahl und wird anschließend wieder in den JavaScript-Typ Number konvertiert. Dezimalstellen (Nachkommastellen) gehen dabei verloren.
Typische Anwendungsfälle sind das Umschalten (Togglen) einzelner Bits in Bitfeldern, einfache Prüfsummen, das Tauschen zweier Integer-Werte ohne Hilfsvariable sowie Aufgaben in der Low-Level-Programmierung, Kryptographie oder Spieleentwicklung.
- Toggle-Bit: Ein bestimmtes Bit lässt sich mit einer Bitmaske zuverlässig umschalten:
flags ^= 0b0100. - XOR-Swap: Zwei ganzzahlige Variablen können ohne Hilfsvariable getauscht werden:
a ^= b; b ^= a; a ^= b;. - Zurücksetzen auf 0:
x ^= xsetztximmer auf0.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $x Pflicht | number | bigint | — | Der linke Operand — eine Variable oder ein zuweisbarer Ausdruck (lvalue), dem das Ergebnis zugewiesen wird. Wird intern in eine vorzeichenbehaftete 32-Bit-Ganzzahl umgewandelt (außer bei BigInt). |
| $y Pflicht | number | bigint | — | Der rechte Operand — ein beliebiger Ausdruck, der zu einer Zahl ausgewertet wird. Wird ebenfalls intern in eine vorzeichenbehaftete 32-Bit-Ganzzahl umgewandelt (außer bei BigInt). |
Rückgabewert
x nach der bitweisen XOR-Operation. Bei normalen Zahlen ist das Ergebnis eine vorzeichenbehaftete 32-Bit-Ganzzahl als Number. Bei BigInt-Operanden ein BigInt.Beispiele
Einzelne Bits mit einer Bitmaske umschalten (Toggle)
// Bit 2 (Wert 4 = 0b0100) in einem Flags-Byte toggeln
let flags = 0b1010; // 10
flags ^= 0b0100; // Bit 2 einschalten → 0b1110
console.log(flags.toString(2)); // "1110"
flags ^= 0b0100; // Bit 2 wieder ausschalten → 0b1010
console.log(flags.toString(2)); // "1010"
XOR-Swap: Zwei Variablen ohne Hilfsvariable tauschen
let a = 42;
let b = 17;
a ^= b; // a = 42 ^ 17 = 59
b ^= a; // b = 17 ^ 59 = 42
a ^= b; // a = 59 ^ 42 = 17
console.log(a); // 17
console.log(b); // 42
Einfache Paritätsprüfung über ein Byte-Array
// XOR aller Bytes ergibt ein einfaches Prüfbyte
const bytes = [0x4A, 0x53, 0x2D, 0x58, 0x4F, 0x52];
let checksum = 0;
for (const byte of bytes) {
checksum ^= byte;
}
console.log(checksum.toString(16)); // Prüfbyte als Hex
Verwendung mit BigInt
let big = 0b1111n;
big ^= 0b1010n;
console.log(big); // 5n (0b0101)
// Wichtig · Fallstricke
32-Bit-Überlauf: Da beide Operanden intern als vorzeichenbehaftete 32-Bit-Ganzzahl behandelt werden, gehen Werte außerhalb des Bereichs -231 bis 231 − 1 nicht verloren — sie werden jedoch abgeschnitten (truncated). Fließkommazahlen wie 3.9 werden dabei zu 3 gekürzt.
Typumwandlung: Nicht-numerische Werte (z. B. null, undefined, Strings) werden vor der Operation zu einer Zahl konvertiert. null ergibt 0, undefined ergibt NaN → wird zu 0. Das kann zu unerwarteten Ergebnissen führen.
BigInt-Mischung verboten: Number und BigInt dürfen nicht gemischt werden — 5n ^= 2 wirft einen TypeError.
XOR-Swap-Fallstrick: Der XOR-Swap-Trick funktioniert nicht, wenn beide Variablen auf dasselbe Objekt/denselben Speicherplatz zeigen (a[i] ^= a[j] bei i === j würde die Variable auf 0 setzen).