Start · Sprachen · JavaScript · Referenz · TypedArray.prototype.indexOf()

TypedArray.prototype.indexOf()

Methode

Gibt den ersten Index zurück, an dem <code>searchElement</code> im typisierten Array vorkommt, oder <code>-1</code>, wenn es nicht gefunden wird.

seit JavaScript ES2016 (Baseline: alle Browser) Kategorie: method-property

Signatur

TypedArray.prototype.indexOf(searchElement, fromIndex)

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

Typ
number
Beschreibung
Der erste Index, an dem 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
1 3 3 -1

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);
[ 'Kopf', 'Zeile 1', 'Zeile 2' ]

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);
[ 1, 3, 4 ]

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));
-1 true -1 2 -1 1

// Wichtig · Fallstricke

  • NaN wird nie gefunden: Weil indexOf() mit === vergleicht, liefert es für NaN immer -1. Prüfe mit includes() oder findIndex(Number.isNaN).
  • Gleitkomma-Genauigkeit: In einem Float32Array werden Werte auf 32 Bit gerundet gespeichert. indexOf(0.1) findet deshalb nichts. Verwende Math.fround() für den Suchwert oder vergleiche mit einer Toleranz über findIndex().
  • Keine Typumwandlung: Die Zeichenkette '5' passt nicht auf 5. In BigInt-Arrays passt 20 nicht auf 20n.
  • +0 und -0 gelten als gleich.
  • Ist der zugrunde liegende ArrayBuffer abgetrennt (detached, z. B. nach postMessage mit Transfer), wird ein TypeError geworfen, 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.