new ArrayBuffer()ArrayBufferArrayBuffer.prototypenew DataView()DataView.prototypeViele Daten im Web sind Text: JSON-Dateien, HTML-Dateien, CSS-Dateien, JavaScript-Code usw. JavaScript verarbeitet solche Daten gut über seine integrierten Strings.
Vor 2011 gab es jedoch keine gute Handhabung von binären Daten. Die Typed Array Specification 1.0 wurde am 8. Februar 2011 eingeführt und bietet Werkzeuge zur Arbeit mit binären Daten. Mit ECMAScript 6 wurden Typed Arrays in die Kernsprache aufgenommen und erhielten Methoden, die zuvor nur für normale Arrays verfügbar waren (.map(), .filter() usw.).
Die Hauptanwendungsfälle für Typed Arrays sind:
ArrayBuffer, Typed Arrays, DataViewDie Typed Array API speichert binäre Daten in Instanzen von ArrayBuffer.
const buf = new ArrayBuffer(4); // length in bytes
// buf is initialized with zerosEin ArrayBuffer selbst ist eine Blackbox: Wenn Sie auf seine Daten zugreifen möchten, müssen Sie ihn in ein anderes Objekt – ein View-Objekt – einwickeln. Zwei Arten von View-Objekten sind verfügbar:
Uint8Array: Elemente sind vorzeichenlose 8-Bit-Integer. Vorzeichenlos bedeutet, dass ihre Bereiche bei Null beginnen.Int16Array: Elemente sind vorzeichenbehaftete 16-Bit-Integer. Vorzeichenbehaftet bedeutet, dass sie ein Vorzeichen haben und negativ, null oder positiv sein können.Float32Array: Elemente sind 32-Bit-Gleitkommazahlen.Uint8, Int16, Float32 usw.), die Sie an jedem beliebigen Byte-Offset lesen und schreiben können.Abb. 20 zeigt ein Klassendiagramm der API.
Typed Arrays werden ähnlich wie normale Arrays verwendet, mit einigen bemerkenswerten Unterschieden:
Der folgende Code zeigt drei verschiedene Möglichkeiten, dasselbe Typed Array zu erstellen:
// Argument: Typed Array or Array-like object
const ta1 = new Uint8Array([0, 1, 2]);
const ta2 = Uint8Array.of(0, 1, 2);
const ta3 = new Uint8Array(3); // length of Typed Array
ta3[0] = 0;
ta3[1] = 1;
ta3[2] = 2;
assert.deepEqual(ta1, ta2);
assert.deepEqual(ta1, ta3);const typedArray = new Int16Array(2); // 2 elements
assert.equal(typedArray.length, 2);
assert.deepEqual(
typedArray.buffer, new ArrayBuffer(4)); // 4 bytesconst typedArray = new Int16Array(2);
assert.equal(typedArray[1], 0); // initialized with 0
typedArray[1] = 72;
assert.equal(typedArray[1], 72);So werden DataViews verwendet:
const dataView = new DataView(new ArrayBuffer(4));
assert.equal(dataView.getInt16(0), 0);
assert.equal(dataView.getUint8(0), 0);
dataView.setUint8(0, 5);| Element | Typed Array | Bytes | Beschreibung | |
|---|---|---|---|---|
Int8 |
Int8Array |
1 | 8-Bit vorzeichenbehafteter Integer | ES6 |
Uint8 |
Uint8Array |
1 | 8-Bit vorzeichenloser Integer | ES6 |
Uint8C |
Uint8ClampedArray |
1 | 8-Bit vorzeichenloser Integer | ES6 |
| (begrenzte Konvertierung) | ES6 | |||
Int16 |
Int16Array |
2 | 16-Bit vorzeichenbehafteter Integer | ES6 |
Uint16 |
Uint16Array |
2 | 16-Bit vorzeichenloser Integer | ES6 |
Int32 |
Int32Array |
4 | 32-Bit vorzeichenbehafteter Integer | ES6 |
Uint32 |
Uint32Array |
4 | 32-Bit vorzeichenloser Integer | ES6 |
BigInt64 |
BigInt64Array |
8 | 64-Bit vorzeichenbehafteter Integer | ES2020 |
BigUint64 |
BigUint64Array |
8 | 64-Bit vorzeichenloser Integer | ES2020 |
Float32 |
Float32Array |
4 | 32-Bit Gleitkommazahl | ES6 |
Float64 |
Float64Array |
8 | 64-Bit Gleitkommazahl | ES6 |
Tab. 20 listet die verfügbaren Elementtypen auf. Diese Typen (z.B. Int32) erscheinen an zwei Stellen:
In Typed Arrays geben sie die Typen der Elemente an. Zum Beispiel haben alle Elemente eines Int32Array den Typ Int32. Der Elementtyp ist der einzige Aspekt von Typed Arrays, der sich unterscheidet.
In DataViews sind es die "Linsen", durch die sie ihre ArrayBuffers beim Verwenden von Methoden wie .getInt32() und .setInt32() aufrufen.
Der Elementtyp Uint8C ist besonders: Er wird nicht von DataView unterstützt und existiert nur, um Uint8ClampedArray zu ermöglichen. Dieses Typed Array wird vom canvas-Element verwendet (wo es CanvasPixelArray ersetzt) und sollte ansonsten vermieden werden. Der einzige Unterschied zwischen Uint8C und Uint8 liegt in der Behandlung von Über- und Unterlauf (wie im nächsten Unterabschnitt erklärt).
Typed Arrays und Array Buffers verwenden Zahlen und BigInts zum Importieren und Exportieren von Werten.
Die Typen BigInt64 und BigUint64 werden über BigInts verarbeitet. Setter akzeptieren beispielsweise BigInts und Getter geben BigInts zurück.
Alle anderen Elementtypen werden über Zahlen verarbeitet.
Normalerweise wird, wenn ein Wert außerhalb des Bereichs des Elementtyps liegt, die Modulo-Arithmetik verwendet, um ihn in einen Wert innerhalb des Bereichs umzuwandeln. Für vorzeichenbehaftete und vorzeichenlose Integer bedeutet dies, dass:
Die folgende Funktion hilft, die Umwandlung zu veranschaulichen:
function setAndGet(typedArray, value) {
typedArray[0] = value;
return typedArray[0];
}Modulo-Umwandlung für vorzeichenlose 8-Bit-Integer
const uint8 = new Uint8Array(1);
// Highest value of range
assert.equal(setAndGet(uint8, 255), 255);
// Overflow
assert.equal(setAndGet(uint8, 256), 0);
// Lowest value of range
assert.equal(setAndGet(uint8, 0), 0);
// Underflow
assert.equal(setAndGet(uint8, -1), 255);Modulo-Umwandlung für vorzeichenbehaftete 8-Bit-Integer
const int8 = new Int8Array(1);
// Highest value of range
assert.equal(setAndGet(int8, 127), 127);
// Overflow
assert.equal(setAndGet(int8, 128), -128);
// Lowest value of range
assert.equal(setAndGet(int8, -128), -128);
// Underflow
assert.equal(setAndGet(int8, -129), 127);Die begrenzende Umwandlung ist anders:
const uint8c = new Uint8ClampedArray(1);
// Highest value of range
assert.equal(setAndGet(uint8c, 255), 255);
// Overflow
assert.equal(setAndGet(uint8c, 256), 255);
// Lowest value of range
assert.equal(setAndGet(uint8c, 0), 0);
// Underflow
assert.equal(setAndGet(uint8c, -1), 0);Immer wenn ein Typ (wie Uint16) als eine Sequenz von mehreren Bytes gespeichert wird, ist die Endianness wichtig:
Uint16-Wert 0x4321 in zwei Bytes gespeichert – zuerst 0x43, dann 0x21. Uint16-Wert 0x4321 in zwei Bytes gespeichert – zuerst 0x21, dann 0x43. Die Endianness ist tendenziell pro CPU-Architektur festgelegt und über native APIs hinweg konsistent. Typed Arrays werden verwendet, um mit diesen APIs zu kommunizieren, weshalb ihre Endianness der Endianness der Plattform folgt und nicht geändert werden kann.
Andererseits variiert die Endianness von Protokollen und Binärdateien, ist aber pro Format plattformübergreifend festgelegt. Daher müssen wir in der Lage sein, auf Daten mit beiden Endianness zuzugreifen. DataViews dienen diesem Zweck und ermöglichen es Ihnen, die Endianness anzugeben, wenn Sie einen Wert abrufen oder setzen.
Zitat von Wikipedia zu Endianness::
Andere Reihenfolgen sind ebenfalls möglich. Diese werden allgemein als Middle-Endian oder Mixed-Endian bezeichnet.
In diesem Abschnitt steht «ElementType»Array für Int8Array, Uint8Array usw. ElementType steht für Int8, Uint8 usw.
«ElementType»Array.from()Diese Methode hat die Typsignatur:
.from<S>(
source: Iterable<S>|ArrayLike<S>,
mapfn?: S => ElementType, thisArg?: any)
: «ElementType»Array.from() konvertiert source in eine Instanz von this (ein Typed Array).
Zum Beispiel sind normale Arrays iterierbar und können mit dieser Methode konvertiert werden:
assert.deepEqual(
Uint16Array.from([0, 1, 2]),
Uint16Array.of(0, 1, 2));Typed Arrays sind ebenfalls iterierbar:
assert.deepEqual(
Uint16Array.from(Uint8Array.of(0, 1, 2)),
Uint16Array.of(0, 1, 2));source kann auch ein Array-ähnliches Objekt sein.
assert.deepEqual(
Uint16Array.from({0:0, 1:1, 2:2, length: 3}),
Uint16Array.of(0, 1, 2));Das optionale mapfn ermöglicht es Ihnen, die Elemente von source zu transformieren, bevor sie zu Elementen des Ergebnisses werden. Warum die beiden Schritte Mapping und Konvertierung in einem Schritt durchführen? Im Vergleich zum separaten Mapping über .map() gibt es zwei Vorteile:
Lesen Sie weiter für eine Erklärung des zweiten Vorteils.
Die statische Methode .from() kann optional sowohl Mappen als auch zwischen Typed Array-Typen konvertieren. Weniger kann schiefgehen, wenn Sie diese Methode verwenden.
Um zu verstehen, warum das so ist, konvertieren wir zuerst ein Typed Array in ein Typed Array mit höherer Präzision. Wenn wir .from() zum Mappen verwenden, ist das Ergebnis automatisch korrekt. Andernfalls müssen Sie zuerst konvertieren und dann mappen.
const typedArray = Int8Array.of(127, 126, 125);
assert.deepEqual(
Int16Array.from(typedArray, x => x * 2),
Int16Array.of(254, 252, 250));
assert.deepEqual(
Int16Array.from(typedArray).map(x => x * 2),
Int16Array.of(254, 252, 250)); // OK
assert.deepEqual(
Int16Array.from(typedArray.map(x => x * 2)),
Int16Array.of(-2, -4, -6)); // wrongWenn wir von einem Typed Array zu einem Typed Array mit niedrigerer Präzision wechseln, erzeugt das Mapping über .from() das korrekte Ergebnis. Andernfalls müssen wir zuerst mappen und dann konvertieren.
assert.deepEqual(
Int8Array.from(Int16Array.of(254, 252, 250), x => x / 2),
Int8Array.of(127, 126, 125));
assert.deepEqual(
Int8Array.from(Int16Array.of(254, 252, 250).map(x => x / 2)),
Int8Array.of(127, 126, 125)); // OK
assert.deepEqual(
Int8Array.from(Int16Array.of(254, 252, 250)).map(x => x / 2),
Int8Array.of(-1, -2, -3)); // wrongDas Problem ist, dass beim Mapping über .map() der Eingabetyp und der Ausgabetyp gleich sind. Im Gegensatz dazu geht .from() von einem beliebigen Eingabetyp zu einem Ausgabetyp über, den Sie über seinen Empfänger angeben.
Typed Arrays sind iterierbar. Das bedeutet, dass Sie die for-of-Schleife und andere iterationsbasierte Mechanismen verwenden können:
const ui8 = Uint8Array.of(0, 1, 2);
for (const byte of ui8) {
console.log(byte);
}
// Output:
// 0
// 1
// 2ArrayBuffers und DataViews sind nicht iterierbar.
Typed Arrays ähneln stark normalen Arrays: Sie haben eine .length, Elemente können über den Klammeroperator [] abgerufen werden, und sie haben die meisten Standard-Array-Methoden. Sie unterscheiden sich von normalen Arrays in folgenden Punkten:
Typed Arrays haben Puffer. Die Elemente eines Typed Arrays ta werden nicht in ta gespeichert, sondern in einem zugehörigen ArrayBuffer, auf den über ta.buffer zugegriffen werden kann.
const ta = new Uint16Array(2); // 2 elements
assert.deepEqual(
ta.buffer, new ArrayBuffer(4)); // 4 bytesTyped Arrays werden mit Nullen initialisiert.
new Array(4) erstellt ein normales Array ohne Elemente. Es hat nur vier Löcher (Indizes kleiner als die .length, die keinem zugeordneten Element entsprechen).new Uint8Array(4) erstellt ein Typed Array, dessen vier Elemente alle 0 sind.assert.deepEqual(new Uint8Array(4), Uint8Array.of(0, 0, 0, 0));Alle Elemente eines Typed Arrays haben denselben Typ.
Das Setzen von Elementen wandelt Werte in diesen Typ um.
const ta = new Uint8Array(1);
ta[0] = 257;
assert.equal(ta[0], 1); // 257 % 256 (overflow)
ta[0] = '2';
assert.equal(ta[0], 2);Das Abrufen von Elementen gibt Zahlen oder BigInts zurück.
const ta = new Uint8Array(1);
assert.equal(ta[0], 0);
assert.equal(typeof ta[0], 'number');Die .length eines Typed Arrays wird aus seinem ArrayBuffer abgeleitet und ändert sich nie (es sei denn, Sie wechseln zu einem anderen ArrayBuffer).
Normale Arrays können Löcher haben; Typed Arrays nicht.
Um ein normales Array in ein Typed Array zu konvertieren, übergeben Sie es an einen Typed Array-Konstruktor (der Array-ähnliche Objekte und Typed Arrays akzeptiert) oder an «ElementType»Array.from() (der Iterables und Array-ähnliche Objekte akzeptiert). Zum Beispiel:
const ta1 = new Uint8Array([0, 1, 2]);
const ta2 = Uint8Array.from([0, 1, 2]);
assert.deepEqual(ta1, ta2);Um ein Typed Array in ein normales Array zu konvertieren, können Sie Array.from() oder Spread-Syntax verwenden (da Typed Arrays iterierbar sind):
assert.deepEqual(
[...Uint8Array.of(0, 1, 2)], [0, 1, 2]
);
assert.deepEqual(
Array.from(Uint8Array.of(0, 1, 2)), [0, 1, 2]
);Typed Arrays haben keine Methode .concat() wie normale Arrays. Die Umgehung besteht darin, ihre überladene Methode .set() zu verwenden:
.set(typedArray: TypedArray, offset=0): void
.set(arrayLike: ArrayLike<number>, offset=0): voidSie kopiert das vorhandene typedArray oder arrayLike in den Empfänger an Index offset. TypedArray ist eine fiktive abstrakte Oberklasse aller konkreten Typed Array-Klassen.
Die folgende Funktion verwendet diese Methode, um null oder mehr Typed Arrays (oder Array-ähnliche Objekte) in eine Instanz von resultConstructor zu kopieren:
function concatenate(resultConstructor, ...arrays) {
let totalLength = 0;
for (const arr of arrays) {
totalLength += arr.length;
}
const result = new resultConstructor(totalLength);
let offset = 0;
for (const arr of arrays) {
result.set(arr, offset);
offset += arr.length;
}
return result;
}
assert.deepEqual(
concatenate(Uint8Array, Uint8Array.of(1, 2), [3, 4]),
Uint8Array.of(1, 2, 3, 4));Zur Vorbereitung auf die Schnellreferenzen zu ArrayBuffers, Typed Arrays und DataViews müssen wir die Unterschiede zwischen Indizes und Offsets lernen:
Indizes für den Klammeroperator [ ]: Sie können nur nicht-negative Indizes (beginnend bei 0) verwenden.
Bei normalen Arrays erstellt das Schreiben auf negative Indizes Eigenschaften:
const arr = [6, 7];
arr[-1] = 5;
assert.deepEqual(
Object.keys(arr), ['0', '1', '-1']);Bei Typed Arrays wird das Schreiben auf negative Indizes ignoriert.
const tarr = Uint8Array.of(6, 7);
tarr[-1] = 5;
assert.deepEqual(
Object.keys(tarr), ['0', '1']);Indizes für Methoden von ArrayBuffers, Typed Arrays und DataViews: Jeder Index kann negativ sein. Wenn er negativ ist, wird er zur Länge der Entität addiert, um den tatsächlichen Index zu erzeugen. Daher bezieht sich -1 auf das letzte Element, -2 auf das vorletzte usw. Methoden normaler Arrays funktionieren genauso.
const ui8 = Uint8Array.of(0, 1, 2);
assert.deepEqual(ui8.slice(-1), Uint8Array.of(2));An Offsets übergebene Werte für Methoden von Typed Arrays und DataViews: müssen nicht-negativ sein – zum Beispiel:
const dataView = new DataView(new ArrayBuffer(4));
assert.throws(
() => dataView.getUint8(-1),
{
name: 'RangeError',
message: 'Offset is outside the bounds of the DataView',
});Ob ein Parameter ein Index oder ein Offset ist, kann nur durch Nachschlagen in der Dokumentation ermittelt werden; es gibt keine einfache Regel.
ArrayBuffers speichern binäre Daten, die über Typed Arrays und DataViews zugegriffen werden sollen.
new ArrayBuffer()Die Typsignatur des Konstruktors lautet:
new ArrayBuffer(length: number)Die Ausführung dieses Konstruktors mit new erstellt eine Instanz, deren Kapazität length Bytes beträgt. Jedes dieser Bytes ist anfänglich 0.
Sie können die Länge eines ArrayBuffers nicht ändern; Sie können nur einen neuen mit einer anderen Länge erstellen.
ArrayBufferArrayBuffer.isView(arg: any)
Gibt true zurück, wenn arg ein Objekt und eine View für einen ArrayBuffer ist (d.h. wenn es ein Typed Array oder ein DataView ist).
ArrayBuffer.prototypeget .byteLength(): number
Gibt die Kapazität dieses ArrayBuffers in Bytes zurück.
.slice(startIndex: number, endIndex=this.byteLength)
Erstellt einen neuen ArrayBuffer, der die Bytes dieses ArrayBuffers enthält, deren Indizes größer oder gleich startIndex und kleiner als endIndex sind. start und endIndex können negativ sein (siehe §32.4 „Schnellreferenz: Indizes vs. Offsets“).
Die Eigenschaften der verschiedenen Typed Array-Objekte werden in zwei Schritten eingeführt:
TypedArray: Zuerst betrachten wir die abstrakte Oberklasse aller Typed Array-Klassen (die im Klassendiagramm zu Beginn dieses Kapitels gezeigt wurde). Ich nenne diese Oberklasse TypedArray, aber sie ist von JavaScript aus nicht direkt zugänglich. TypedArray.prototype enthält alle Methoden von Typed Arrays.«ElementType»Array: Die konkreten Typed Array-Klassen heißen Uint8Array, Int16Array, Float32Array usw. Dies sind die Klassen, die Sie über new, .of und .from() verwenden.TypedArray<T>Beide statischen TypedArray-Methoden werden von ihren Unterklassen (Uint8Array usw.) geerbt. TypedArray ist abstrakt. Daher verwenden Sie diese Methoden immer über die Unterklassen, die konkret sind und direkte Instanzen haben können.
.from<S>(source: Iterable<S>|ArrayLike<S>, mapfn?: S => T, thisArg?: any) : instanceof this
Konvertiert ein Iterable (einschließlich Arrays und Typed Arrays) oder ein Array-ähnliches Objekt in eine Instanz von this (instanceof this ist meine Erfindung, um diesen Fakt auszudrücken).
assert.deepEqual(
Uint16Array.from([0, 1, 2]),
Uint16Array.of(0, 1, 2));Das optionale mapfn ermöglicht es Ihnen, die Elemente von source zu transformieren, bevor sie zu Elementen des Ergebnisses werden.
assert.deepEqual(
Int16Array.from(Int8Array.of(127, 126, 125), x => x * 2),
Int16Array.of(254, 252, 250));.of(...items: bigint[]): instanceof this (BigInt64Array, BigUint64Array)
.of(...items: number[]): instanceof this (alle anderen Typed Arrays)
Erstellt eine neue Instanz von this, deren Elemente items sind (konvertiert in den Elementtyp).
assert.deepEqual(
Int16Array.of(-1234, 5, 67),
new Int16Array([-1234, 5, 67]) );TypedArray<T>.prototypeVon Typed Array-Methoden akzeptierte Indizes können negativ sein (sie funktionieren auf diese Weise wie traditionelle Array-Methoden). Offsets müssen nicht-negativ sein. Details finden Sie unter §32.4 „Schnellreferenz: Indizes vs. Offsets“.
Die folgenden Eigenschaften sind spezifisch für Typed Arrays; normale Arrays haben sie nicht:
get .buffer(): ArrayBuffer
Gibt den Puffer zurück, der dieses Typed Array unterstützt.
get .length(): number
Gibt die Länge dieses Typed Arrays in Elementen seines Puffers zurück.
get .byteLength(): number
Gibt die Größe dieses Typed Arrays in Bytes seines Puffers zurück.
get .byteOffset(): number
Gibt den Offset zurück, an dem dieses Typed Array in seinem ArrayBuffer "beginnt".
.set(typedArray: TypedArray, offset=0): void
.set(arrayLike: ArrayLike<bigint>, offset=0): void (BigInt64Array, BigUint64Array)
.set(arrayLike: ArrayLike<number>, offset=0): void (alle anderen Typed Arrays)
Kopiert alle Elemente des ersten Parameters in dieses Typed Array. Das Element an Index 0 des Parameters wird an Index offset dieses Typed Arrays geschrieben (usw.). Weitere Informationen zu Array-ähnlichen Objekten finden Sie in §31.5 „Array-ähnliche Objekte“.
.subarray(startIndex=0, endIndex=this.length): TypedArray<T>
Gibt ein neues Typed Array zurück, das denselben Puffer wie dieses Typed Array hat, aber einen (im Allgemeinen) kleineren Bereich. Wenn startIndex nicht-negativ ist, ist das erste Element des resultierenden Typed Arrays this[startIndex], das zweite this[startIndex+1] (usw.). Wenn startIndex negativ ist, wird es entsprechend umgewandelt.
Die folgenden Methoden sind im Grunde gleich wie die Methoden von normalen Arrays:
.at(index: number): T | undefined [R, ES2022].copyWithin(target: number, start: number, end=this.length): this [W, ES6].entries(): Iterable<[number, T]> [R, ES6].every(callback: (value: T, index: number, array: TypedArray<T>) => boolean, thisArg?: any): boolean [R, ES6].fill(value: T, start=0, end=this.length): this [W, ES6].filter(callback: (value: T, index: number, array: TypedArray<T>) => any, thisArg?: any): T[] [R, ES6].find(predicate: (value: T, index: number, obj: T[]) => boolean, thisArg?: any): T | undefined [R, ES6].findIndex(predicate: (value: T, index: number, obj: T[]) => boolean, thisArg?: any): number [R, ES6].forEach(callback: (value: T, index: number, array: TypedArray<T>) => void, thisArg?: any): void [R, ES6].includes(searchElement: T, fromIndex=0): boolean [R, ES2016].indexOf(searchElement: T, fromIndex=0): number [R, ES6].join(separator = ','): string [R, ES6].keys(): Iterable<number> [R, ES6].lastIndexOf(searchElement: T, fromIndex=this.length-1): number [R, ES6].map<U>(mapFunc: (value: T, index: number, array: TypedArray<T>) => U, thisArg?: any): U[] [R, ES6].reduce<U>(callback: (accumulator: U, element: T, index: number, array: T[]) => U, init?: U): U [R, ES6].reduceRight<U>(callback: (accumulator: U, element: T, index: number, array: T[]) => U, init?: U): U [R, ES6].reverse(): this [W, ES6].slice(start=0, end=this.length): T[] [R, ES6].some(callback: (value: T, index: number, array: TypedArray<T>) => boolean, thisArg?: any): boolean [R, ES6].sort(compareFunc?: (a: T, b: T) => number): this [W, ES6].toString(): string [R, ES6].values(): Iterable<T> [R, ES6]Details zur Funktionsweise dieser Methoden finden Sie unter §31.13.3 „Methoden von Array.prototype“.
new «ElementType»Array()Jeder Typed Array-Konstruktor hat einen Namen, der dem Muster «ElementType»Array folgt, wobei «ElementType» einer der Elementtypen in der Tabelle am Anfang ist. Das bedeutet, dass es 11 Konstruktoren für Typed Arrays gibt:
Float32Array, Float64ArrayInt8Array, Int16Array, Int32Array, BigInt64ArrayUint8Array, Uint8ClampedArray, Uint16Array, Uint32Array, BigUint64ArrayJeder Konstruktor hat vier überladene Versionen – er verhält sich unterschiedlich, abhängig von der Anzahl der Argumente und deren Typen:
new «ElementType»Array(buffer: ArrayBuffer, byteOffset=0, length=0)
Erstellt ein neues «ElementType»Array, dessen Puffer buffer ist. Es beginnt den Zugriff auf den Puffer am angegebenen byteOffset und hat die angegebene length. Beachten Sie, dass length Elemente des Typed Arrays zählt (mit jeweils 1–8 Bytes) und nicht Bytes.
new «ElementType»Array(length=0)
Erstellt ein neues «ElementType»Array mit der angegebenen length und dem entsprechenden Puffer. Die Größe des Puffers in Bytes beträgt:
length * «ElementType»Array.BYTES_PER_ELEMENTnew «ElementType»Array(source: TypedArray)
Erstellt eine neue Instanz von «ElementType»Array, deren Elemente dieselben Werte wie die Elemente von source haben, aber in ElementType konvertiert sind.
new «ElementType»Array(source: ArrayLike<bigint>) (BigInt64Array, BigUint64Array)
new «ElementType»Array(source: ArrayLike<number>) (alle anderen Typed Arrays)
Erstellt eine neue Instanz von «ElementType»Array, deren Elemente dieselben Werte wie die Elemente von source haben, aber in ElementType konvertiert sind. Weitere Informationen zu Array-ähnlichen Objekten finden Sie in §31.5 „Array-ähnliche Objekte“.
«ElementType»Array«ElementType»Array.BYTES_PER_ELEMENT: number
Zählt, wie viele Bytes zum Speichern eines einzelnen Elements benötigt werden.
> Uint8Array.BYTES_PER_ELEMENT
1
> Int16Array.BYTES_PER_ELEMENT
2
> Float64Array.BYTES_PER_ELEMENT
8«ElementType»Array.prototype.BYTES_PER_ELEMENT: number
Dasselbe wie «ElementType»Array.BYTES_PER_ELEMENT.
new DataView()new DataView(buffer: ArrayBuffer, byteOffset=0, byteLength=buffer.byteLength-byteOffset)
buffer gespeichert sind. Standardmäßig kann die neue DataView auf den gesamten buffer zugreifen. Die letzten beiden Parameter ermöglichen es Ihnen, dies zu ändern.DataView.prototypeIm Rest dieses Abschnitts bezieht sich «ElementType» auf entweder:
Int8, Int16, Int32, BigInt64Uint8, Uint16, Uint32, BigUint64Float32, Float64Dies sind die Eigenschaften von DataView.prototype:
get .buffer(): ArrayBuffer
Gibt den ArrayBuffer dieser DataView zurück.
get .byteLength(): number
Gibt zurück, wie viele Bytes von dieser DataView zugänglich sind.
get .byteOffset(): number
Gibt zurück, an welchem Offset diese DataView mit dem Zugriff auf die Bytes in ihrem Puffer beginnt.
.get«ElementType»(byteOffset: number, littleEndian=false): bigint (BigInt64, BigUint64)
.get«ElementType»(byteOffset: number, littleEndian=false): number (alle anderen Elementtypen)
Liest einen Wert aus dem Puffer dieser DataView.
.set«ElementType»(byteOffset: number, value: bigint, littleEndian=false): void (BigInt64, BigUint64)
.set«ElementType»(byteOffset: number, value: number, littleEndian=false): void (alle anderen Elementtypen)
Schreibt value in den Puffer dieser DataView.