Start · Sprachen · JavaScript · Referenz · DataView.prototype.buffer

DataView.prototype.buffer

Eigenschaft

Gibt den <code>ArrayBuffer</code> oder <code>SharedArrayBuffer</code> zurück, auf den die <code>DataView</code> bei ihrer Erzeugung festgelegt wurde (nur lesbar).

seit JavaScript ES2015 (Baseline: alle Browser, Node.js 0.10+) Kategorie: method-property

Signatur

get DataView.prototype.buffer

Beschreibung

buffer ist eine nur lesbare Accessor-Eigenschaft (nur Getter) auf DataView.prototype. Sie liefert den zugrunde liegenden Speicherpuffer, den man beim Aufruf von new DataView(buffer, byteOffset, byteLength) übergeben hat. Der Wert wird beim Erzeugen festgelegt und lässt sich danach nicht mehr ändern.

Eine DataView ist nur ein Fenster auf einen Ausschnitt des Puffers. Über buffer kommt man an den gesamten Speicher heran, etwa um eine weitere Ansicht (Uint8Array, Float32Array, eine zweite DataView) auf denselben Daten anzulegen, den Puffer per postMessage weiterzugeben oder ihn an fetch, Blob oder WebAssembly zu übergeben.

Wichtig: buffer gibt immer den ganzen Puffer zurück, nicht nur den Ausschnitt, den die Ansicht zeigt. Wer genau diesen Ausschnitt braucht, muss byteOffset und byteLength berücksichtigen, zum Beispiel mit view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength).

Rückgabewert

Typ
ArrayBuffer | SharedArrayBuffer
Beschreibung
Genau das Puffer-Objekt (dieselbe Referenz, keine Kopie), das dem DataView-Konstruktor übergeben wurde.

Beispiele

Zugrunde liegenden Puffer abfragen

const buffer = new ArrayBuffer(16);
const view = new DataView(buffer, 4, 8);

console.log(view.buffer === buffer);   // gleiche Referenz
console.log(view.buffer.byteLength);   // Größe des GANZEN Puffers
console.log(view.byteLength);          // Größe des Ausschnitts
true 16 8

Zweite Ansicht auf denselben Speicher legen

const view = new DataView(new ArrayBuffer(4));
view.setUint32(0, 0xCAFEBABE); // Big-Endian ist Standard

// Byteweise Sicht auf dieselben Daten
const bytes = new Uint8Array(view.buffer);
console.log([...bytes].map(b => b.toString(16)));
[ 'ca', 'fe', 'ba', 'be' ]

Nur den sichtbaren Ausschnitt kopieren (z. B. Protokoll-Header)

const packet = new Uint8Array([0xff, 0xff, 0x01, 0x02, 0x03, 0x04, 0xee]);
// Header beginnt bei Byte 2 und ist 4 Byte lang
const header = new DataView(packet.buffer, 2, 4);

const headerCopy = header.buffer.slice(
  header.byteOffset,
  header.byteOffset + header.byteLength
);
console.log(new Uint8Array(headerCopy));
Uint8Array(4) [ 1, 2, 3, 4 ]

Puffer an einen Worker übertragen

const view = new DataView(new ArrayBuffer(8));
view.setFloat64(0, Math.PI);

const { port1, port2 } = new MessageChannel();
port2.onmessage = ({ data }) => {
  console.log(new DataView(data).getFloat64(0));
  port2.close();
};
// Puffer wird übertragen (transfer), nicht kopiert
port1.postMessage(view.buffer, [view.buffer]);
console.log(view.byteLength); // Ansicht ist jetzt abgekoppelt (detached)
0 3.141592653589793

// Wichtig · Fallstricke

  • Nur lesbar: Eine Zuweisung wie view.buffer = x wird im nicht-strikten Modus stillschweigend ignoriert und löst im Strict Mode einen TypeError aus.
  • Ganzer Puffer statt Ausschnitt: Ein häufiger Fehler ist, view.buffer weiterzugeben und dabei zu vergessen, dass byteOffset/byteLength nur einen Teil markieren. Das gilt besonders, wenn die DataView aus typedArray.buffer erzeugt wurde, z. B. aus Node.js-Buffer-Objekten, die oft einen gemeinsamen Speicherpool nutzen.
  • Abgekoppelte Puffer: Nach einem Transfer (postMessage mit Transferliste, ArrayBuffer.prototype.transfer()) liefert buffer weiterhin das Objekt, aber dessen byteLength ist 0. Lese- und Schreibzugriffe über die DataView werfen dann einen TypeError.
  • Der Getter wirft einen TypeError, wenn er mit einem this aufgerufen wird, das keine DataView ist, etwa per Reflect.get auf einem fremden Objekt.
  • SharedArrayBuffer ist in Browsern nur in cross-origin-isolierten Kontexten verfügbar (Header COOP/COEP). Die Eigenschaft selbst wird von allen modernen Browsern und Node.js unterstützt.