Signatur
Beschreibung
ArrayBuffer.isView() ist eine statische Methode. Sie liefert true, wenn der übergebene Wert eine Ansicht auf einen Binärpuffer ist. Dazu zählen alle typisierten Arrays (Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array, BigInt64Array, BigUint64Array) und DataView-Objekte. Intern wird nur geprüft, ob das Objekt den internen Slot [[ViewedArrayBuffer]] besitzt.
Nützlich ist die Methode vor allem in Funktionen, die Binärdaten in mehreren Formen annehmen: als rohen ArrayBuffer, als typisiertes Array oder als DataView. Liefert isView() true, kommt man über .buffer, .byteOffset und .byteLength an genau den Speicherbereich, den die Ansicht abdeckt.
Wichtig: Ein ArrayBuffer ist selbst keine Ansicht. Für ihn liefert isView() false. Dasselbe gilt für SharedArrayBuffer, normale Arrays, Node.js-fremde Objekte mit ähnlichen Eigenschaften und alle primitiven Werte. Anders als instanceof funktioniert die Prüfung auch über Realm-Grenzen hinweg, also bei Objekten aus iframes, Workern oder vm-Kontexten in Node.js.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $value Pflicht | any | Der zu prüfende Wert. Beliebiger Typ. Wird er weggelassen, wird undefined geprüft und das Ergebnis ist false. |
Rückgabewert
true, wenn value ein typisiertes Array oder ein DataView ist, sonst false. Die Methode wirft nie eine Ausnahme.Beispiele
Grundlegende Prüfungen
const buffer = new ArrayBuffer(8);
console.log(ArrayBuffer.isView(new Uint8Array(buffer))); // typisiertes Array
console.log(ArrayBuffer.isView(new DataView(buffer))); // DataView
console.log(ArrayBuffer.isView(buffer)); // roher Puffer
console.log(ArrayBuffer.isView([1, 2, 3])); // normales Array
console.log(ArrayBuffer.isView(null));
console.log(ArrayBuffer.isView());
Binärdaten beliebiger Form in ein Uint8Array umwandeln
// Nimmt ArrayBuffer, typisierte Arrays oder DataView entgegen
const toBytes = (data) => {
if (ArrayBuffer.isView(data)) {
// Nur den Bereich der Ansicht übernehmen, nicht den ganzen Puffer
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
}
if (data instanceof ArrayBuffer) {
return new Uint8Array(data);
}
throw new TypeError('Binärdaten erwartet');
};
const full = new Uint16Array([0x0102, 0x0304, 0x0506]);
const slice = full.subarray(1); // Ansicht ab Byte 2
console.log(toBytes(slice).length);
console.log(toBytes(full.buffer).length);
Daten vor dem Hashen mit der Web Crypto API prüfen
const sha256Hex = async (input) => {
const data = typeof input === 'string'
? new TextEncoder().encode(input)
: ArrayBuffer.isView(input) || input instanceof ArrayBuffer
? input
: null;
if (data === null) throw new TypeError('String oder Binärdaten erwartet');
const hash = await crypto.subtle.digest('SHA-256', data);
return [...new Uint8Array(hash)]
.map((b) => b.toString(16).padStart(2, '0'))
.join('');
};
const hex = await sha256Hex(new Uint8Array([104, 105])); // "hi"
console.log(hex.slice(0, 16));
Realm-übergreifende Prüfung in Node.js
import vm from 'node:vm';
// Uint8Array aus einem fremden Kontext erzeugen
const foreign = vm.runInNewContext('new Uint8Array(4)');
console.log(foreign instanceof Uint8Array); // anderer Konstruktor
console.log(ArrayBuffer.isView(foreign)); // prüft den internen Slot
// Wichtig · Fallstricke
- ArrayBuffer ist keine Ansicht:
ArrayBuffer.isView(new ArrayBuffer(8))liefertfalse. Wer „irgendwelche Binärdaten“ akzeptieren will, muss zusätzlich aufArrayBuffer(und ggf.SharedArrayBuffer) prüfen. - Typisiertes Array oder DataView? Die Methode unterscheidet nicht. Ein
DataViewhat keinen Indexzugriff und keinelength. Zur Unterscheidungdata instanceof DataViewnutzen oder in Node.jsutil.types.isTypedArray()bzw.util.types.isDataView(). - Node.js-
Buffer:Bufferist eine Unterklasse vonUint8Array, daher istArrayBuffer.isView(Buffer.from('x'))true. Achtung: Kleine Buffer teilen sich oft einen großen Pool-Puffer. Deshalb immerbyteOffsetundbyteLengthberücksichtigen und nie einfachdata.bufferkomplett verwenden. - Nicht fälschbar: Objekte, die nur
buffer/byteLength-Eigenschaften nachbilden, und Proxys um typisierte Arrays liefernfalse, weil der interne Slot fehlt. - Abgelöste Puffer: Auch eine Ansicht auf einen übertragenen (detached) Puffer, z. B. nach
postMessagemit Transfer, liefert weiterhintrue. IhrebyteLengthist dann aber0. - Kompatibilität: Seit ES2015 in allen modernen Browsern und in Node.js verfügbar (Baseline). Im Internet Explorer gibt es sie erst ab Version 11.