Signatur
Beschreibung
Der bitweise NICHT-Operator (~) ist ein unärer Operator, der auf seinen Operanden angewendet wird und jedes einzelne Bit invertiert: Nullen werden zu Einsen und Einsen zu Nullen. Bei normalen JavaScript-Zahlen wird der Operand zunächst in einen vorzeichenbehafteten 32-Bit-Ganzzahlwert (Int32) umgewandelt. Das Ergebnis dieser Bit-Invertierung entspricht mathematisch immer -(n + 1), wobei n der ursprüngliche Ganzzahlwert ist.
Ein klassischer Anwendungsfall ist die Prüfung, ob ein Element in einem Array oder ein Teilstring in einem String enthalten ist: Da indexOf() den Wert -1 zurückgibt, wenn nichts gefunden wurde, und ~(-1) den Wert 0 (also falsy) ergibt, kann ~arr.indexOf(x) als kompakte Wahrheitsprüfung genutzt werden. Alle anderen Rückgabewerte von indexOf() ergeben durch ~ einen truthy-Wert.
Der Operator unterstützt seit ES2020 auch BigInt-Werte. Dabei findet keine Konvertierung in Int32 statt; die Bits werden direkt in der arbiträr langen Darstellung invertiert. Wichtig: ~ kann nicht auf einen Mix aus Number und BigInt angewendet werden — beide Seiten müssen denselben Typ haben.
In modernem Code wird ~indexOf() häufig durch includes() ersetzt, da Letzteres klarer und lesbarer ist. Der Operator bleibt dennoch nützlich für Low-Level-Bitmanipulationen, z. B. in Masken, Flags, Grafik- oder Kryptografie-Algorithmen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $operand Pflicht | number|bigint | — | Der Wert, dessen Bits invertiert werden sollen. Normale Zahlen werden intern in einen vorzeichenbehafteten 32-Bit-Integer umgewandelt. BigInt-Werte werden direkt verarbeitet. |
Rückgabewert
-(n + 1)). Bei BigInt ein BigInt-Wert.Beispiele
Grundlegende Bit-Invertierung
console.log(~0); // -1 (0b00...000 → 0b11...111)
console.log(~1); // -2
console.log(~-1); // 0
console.log(~255); // -256
console.log(~42); // -43 (entspricht -(42 + 1))
Enthaltensein prüfen mit ~indexOf()
const fruits = ['Apfel', 'Banane', 'Kirsche'];
// Klassische Variante mit ~indexOf (kompakt, aber weniger lesbar)
if (~fruits.indexOf('Banane')) {
console.log('Banane gefunden!');
}
// ~(-1) ergibt 0 → falsy → Element nicht vorhanden
if (!~fruits.indexOf('Mango')) {
console.log('Mango nicht im Array.');
}
// Moderne, bevorzugte Alternative:
if (fruits.includes('Kirsche')) {
console.log('Kirsche gefunden (mit includes).');
}
Bitweise Maske mit dem ~-Operator
// Flags als Bitmaske: einzelne Bits ein- und ausschalten
const FLAG_READ = 0b001; // 1
const FLAG_WRITE = 0b010; // 2
const FLAG_EXECUTE = 0b100; // 4
let permissions = FLAG_READ | FLAG_WRITE | FLAG_EXECUTE; // alle Rechte: 7
console.log(permissions.toString(2)); // '111'
// WRITE-Bit löschen mit ~
permissions &= ~FLAG_WRITE;
console.log(permissions.toString(2)); // '101' → READ + EXECUTE
Verwendung mit BigInt
const big = 42n;
console.log(~big); // -43n
const negOne = -1n;
console.log(~negOne); // 0n
// Wichtig · Fallstricke
32-Bit-Beschränkung bei Number: Zahlen außerhalb des 32-Bit-Integer-Bereichs (±2 147 483 647) werden vor der Invertierung auf Int32 gekürzt. Das kann zu unerwarteten Ergebnissen führen, z. B.: ~(2**32) ergibt -1, weil 2**32 als Int32 den Wert 0 hat.
Typ-Mischung verboten: ~ auf einen BigInt anzuwenden, während die restliche Berechnung Numbers verwendet (oder umgekehrt), wirft einen TypeError. Immer sicherstellen, dass der Operand konsistent einen Typ hat.
Lesbarkeit: Der Trick ~arr.indexOf(x) ist in älteren Codebasen verbreitet, gilt aber als schwer lesbar. Bevorzuge arr.includes(x) (ES2016) bzw. str.includes(substr) für String-Prüfungen, sofern kein IE-Support erforderlich ist.