Signatur
Beschreibung
BYTES_PER_ELEMENT ist eine statische Dateneigenschaft, die jeder Konstruktor eines typisierten Arrays mitbringt, also Int8Array, Uint8Array, Float64Array usw. Sie gibt die feste Größe eines Elements in Bytes an. Zusätzlich gibt es dieselbe Eigenschaft auf dem Prototyp, deshalb kann man sie auch über eine Instanz abfragen (arr.BYTES_PER_ELEMENT).
Die Werte sind festgelegt:
1:Int8Array,Uint8Array,Uint8ClampedArray2:Int16Array,Uint16Array,Float16Array4:Int32Array,Uint32Array,Float32Array8:Float64Array,BigInt64Array,BigUint64Array
Gebraucht wird die Eigenschaft vor allem, wenn man mit rohem Speicher arbeitet: um die Größe eines ArrayBuffer zu berechnen, um Byte-Versätze für Sichten auf einen gemeinsamen Puffer festzulegen oder um in WebGL- und WebGPU-Code die Parameter stride und offset zu ermitteln. Mit der Eigenschaft statt fest eingetragener Zahlen bleibt der Code richtig, auch wenn später ein anderer Datentyp verwendet wird.
Beispiele
Elementgrößen der Konstruktoren abfragen
const typen = [Int8Array, Uint16Array, Int32Array, Float32Array, Float64Array, BigInt64Array];
for (const Typ of typen) {
console.log(`${Typ.name}: ${Typ.BYTES_PER_ELEMENT} Byte(s)`);
}
ArrayBuffer passender Größe anlegen
const anzahlPunkte = 1000;
// Jeder Punkt hat x, y, z als Float32
const bytes = anzahlPunkte * 3 * Float32Array.BYTES_PER_ELEMENT;
const buffer = new ArrayBuffer(bytes);
const punkte = new Float32Array(buffer);
console.log(buffer.byteLength, punkte.length);
Verschachteltes Vertex-Layout für WebGL berechnen
// Layout je Vertex: Position (3 × float) + Farbe (4 × float)
const F = Float32Array.BYTES_PER_ELEMENT;
const stride = (3 + 4) * F; // Bytes pro Vertex
const farbOffset = 3 * F; // Farbe beginnt nach der Position
console.log({ stride, farbOffset });
// In echtem WebGL-Code:
// gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, stride, 0);
// gl.vertexAttribPointer(colLoc, 4, gl.FLOAT, false, stride, farbOffset);
Abfrage über eine Instanz und für Sichten auf einen gemeinsamen Puffer
const buffer = new ArrayBuffer(16);
const kopf = new Uint32Array(buffer, 0, 2); // 8 Bytes Kopfdaten
const daten = new Uint16Array(buffer, 2 * Uint32Array.BYTES_PER_ELEMENT);
console.log(kopf.BYTES_PER_ELEMENT); // über den Prototyp
console.log(daten.byteOffset, daten.length);
// Wichtig · Fallstricke
- Nur lesbar: Zuweisungen wie
Int32Array.BYTES_PER_ELEMENT = 2haben keine Wirkung. Im Strict Mode lösen sie einenTypeErroraus. - Kein Konstruktor
TypedArrayim globalen Bereich:TypedArrayist nur ein Oberbegriff für die gemeinsame, verborgene Basisklasse. Den Wert fragt man daher immer an einem konkreten Konstruktor ab, etwaFloat64Array.BYTES_PER_ELEMENT. Die Basisklasse selbst, erreichbar überObject.getPrototypeOf(Int8Array), hat diese Eigenschaft nicht. - Ausrichtung beachten: Der
byteOffsetbeim Erzeugen einer Sicht auf einenArrayBuffermuss ein Vielfaches vonBYTES_PER_ELEMENTsein. Sonst wird einRangeErrorausgelöst. Das gilt auch für die Länge des Puffers, wenn keine eigene Länge angegeben wird. Für nicht ausgerichtete Zugriffe verwendet manDataView. - Nicht mit
byteLengthverwechseln:BYTES_PER_ELEMENTgibt die Größe eines einzelnen Elements an.byteLengthist die Gesamtgröße der Sicht und entsprichtlength × BYTES_PER_ELEMENT. - Kompatibilität: Wird von allen modernen Browsern und von Node.js unterstützt.
BigInt64ArrayundBigUint64Arraygibt es seit ES2020.Float16Arrayist neu (ES2025) und in älteren Umgebungen noch nicht vorhanden.