Signatur
Beschreibung
indexOf() durchsucht ein typisiertes Array (z. B. Uint8Array, Float32Array) von vorne nach hinten und liefert den Index des ersten Elements, das mit searchElement übereinstimmt. Verglichen wird mit strikter Gleichheit (===), also ohne Typumwandlung. Die Methode arbeitet wie Array.prototype.indexOf(), ist aber auf typisierte Arrays zugeschnitten. Sie ist nicht generisch und funktioniert nur auf echten TypedArray-Instanzen.
Mit dem optionalen Parameter fromIndex legst du fest, ab welcher Position gesucht wird. Negative Werte zählen vom Ende des Arrays aus: -1 steht für das letzte Element. Ist fromIndex größer oder gleich der Länge, gibt die Methode sofort -1 zurück.
Typische Einsatzfälle sind die Suche nach Trennbytes oder Markierungen in Binärdaten (z. B. ein Nullbyte oder Zeilenumbruch in einem Uint8Array aus fetch oder einer Datei), das Finden von Sentinel-Werten in numerischen Puffern und schnelle Prüfungen in großen Zahlenreihen.
Willst du nur wissen, ob ein Wert enthalten ist, ist includes() oft lesbarer. Außerdem findet includes() auch NaN, indexOf() dagegen nicht.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $searchElement Pflicht | number | bigint | Der gesuchte Wert. Verglichen wird strikt (===). Bei BigInt64Array/BigUint64Array muss es ein bigint sein. |
|
| $fromIndex | number | 0 | Startindex der Suche, wird in eine Ganzzahl umgewandelt. Negative Werte zählen vom Ende (length + fromIndex). Ist das Ergebnis kleiner als -length, wird ab 0 gesucht. |
Rückgabewert
searchElement gefunden wurde, sonst -1.Beispiele
Einfache Suche und Suche ab Startindex
const werte = new Uint8Array([2, 5, 9, 5, 7]);
console.log(werte.indexOf(5)); // erstes Vorkommen
console.log(werte.indexOf(5, 2)); // Suche ab Index 2
console.log(werte.indexOf(5, -2)); // Suche ab dem vorletzten Element
console.log(werte.indexOf(42)); // nicht vorhanden
Zeilen in Binärdaten aufteilen (Suche nach \n)
const bytes = new TextEncoder().encode('Kopf\nZeile 1\nZeile 2');
const NEWLINE = 0x0a;
const zeilen = [];
let start = 0;
let pos;
while ((pos = bytes.indexOf(NEWLINE, start)) !== -1) {
zeilen.push(new TextDecoder().decode(bytes.subarray(start, pos)));
start = pos + 1;
}
zeilen.push(new TextDecoder().decode(bytes.subarray(start)));
console.log(zeilen);
Alle Positionen eines Werts finden
const messwerte = new Int16Array([0, -1, 3, -1, -1, 8]);
const fehlend = [];
let i = messwerte.indexOf(-1);
while (i !== -1) {
fehlend.push(i);
i = messwerte.indexOf(-1, i + 1);
}
console.log(fehlend);
Fallstricke: NaN, Umwandlung und BigInt
const f = new Float32Array([1.5, NaN, 0.1]);
console.log(f.indexOf(NaN)); // NaN ist nie === NaN
console.log(f.includes(NaN)); // includes nutzt SameValueZero
console.log(f.indexOf(0.1)); // 0.1 wurde als float32 gespeichert
console.log(f.indexOf(Math.fround(0.1)));
const big = new BigInt64Array([10n, 20n]);
console.log(big.indexOf(20)); // number statt bigint
console.log(big.indexOf(20n));
// Wichtig · Fallstricke
- NaN wird nie gefunden: Weil
indexOf()mit===vergleicht, liefert es fürNaNimmer-1. Prüfe mitincludes()oderfindIndex(Number.isNaN). - Gleitkomma-Genauigkeit: In einem
Float32Arraywerden Werte auf 32 Bit gerundet gespeichert.indexOf(0.1)findet deshalb nichts. VerwendeMath.fround()für den Suchwert oder vergleiche mit einer Toleranz überfindIndex(). - Keine Typumwandlung: Die Zeichenkette
'5'passt nicht auf5. In BigInt-Arrays passt20nicht auf20n. +0und-0gelten als gleich.- Ist der zugrunde liegende
ArrayBufferabgetrennt (detached, z. B. nachpostMessagemit Transfer), wird einTypeErrorgeworfen, weil der Puffer ungültig ist. - Die Suche ist linear (O(n)). Bei vielen Abfragen auf großen Arrays lohnt sich eine eigene Indexstruktur, etwa eine
Map. - Wird in allen modernen Browsern und in Node.js unterstützt.