Start · Sprachen · JavaScript · Referenz · ArrayBuffer.isView()

ArrayBuffer.isView()

Methode

Prüft, ob ein Wert eine Ansicht auf einen <code>ArrayBuffer</code> ist, also ein typisiertes Array (z. B. <code>Uint8Array</code>) oder ein <code>DataView</code>.

seit JavaScript ES2015 Kategorie: method-property

Signatur

ArrayBuffer.isView(value)

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

Typ
boolean
Beschreibung
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());
true true false false false false

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);
4 6

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));
8f434346648f6b96

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
false true

// Wichtig · Fallstricke

  • ArrayBuffer ist keine Ansicht: ArrayBuffer.isView(new ArrayBuffer(8)) liefert false. Wer „irgendwelche Binärdaten“ akzeptieren will, muss zusätzlich auf ArrayBuffer (und ggf. SharedArrayBuffer) prüfen.
  • Typisiertes Array oder DataView? Die Methode unterscheidet nicht. Ein DataView hat keinen Indexzugriff und keine length. Zur Unterscheidung data instanceof DataView nutzen oder in Node.js util.types.isTypedArray() bzw. util.types.isDataView().
  • Node.js-Buffer: Buffer ist eine Unterklasse von Uint8Array, daher ist ArrayBuffer.isView(Buffer.from('x')) true. Achtung: Kleine Buffer teilen sich oft einen großen Pool-Puffer. Deshalb immer byteOffset und byteLength berücksichtigen und nie einfach data.buffer komplett verwenden.
  • Nicht fälschbar: Objekte, die nur buffer/byteLength-Eigenschaften nachbilden, und Proxys um typisierte Arrays liefern false, weil der interne Slot fehlt.
  • Abgelöste Puffer: Auch eine Ansicht auf einen übertragenen (detached) Puffer, z. B. nach postMessage mit Transfer, liefert weiterhin true. Ihre byteLength ist dann aber 0.
  • 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.