Start · Sprachen · JavaScript · Referenz · TypedArray.prototype.toReversed()

TypedArray.prototype.toReversed()

Methode

Gibt ein neues typisiertes Array mit den Elementen in umgekehrter Reihenfolge zurück, ohne das Original zu verändern – das kopierende Gegenstück zu <code>reverse()</code>.

seit JavaScript ES2023 (Baseline seit 2023: Chrome 110, Firefox 11 Kategorie: method-property

Signatur

TypedArray.prototype.toReversed()

Beschreibung

toReversed() ist die nicht-mutierende Variante von TypedArray.prototype.reverse(). Während reverse() die Elemente direkt im zugrunde liegenden Puffer umdreht und dasselbe Objekt zurückgibt, erzeugt toReversed() ein neues typisiertes Array desselben Typs (z. B. Uint8Array, Float32Array) mit eigenem ArrayBuffer. Das Original bleibt unverändert.

Die Methode gehört zu den mit ES2023 eingeführten „Change Array by Copy“-Methoden (toReversed(), toSorted(), with()). Für typisierte Arrays gibt es toSpliced() absichtlich nicht, weil sich deren Länge nicht ändern lässt.

Sinnvoll ist toReversed() immer dann, wenn Binärdaten gemeinsam genutzt werden, etwa Audio-Samples, Pixeldaten oder Messreihen, und andere Programmteile weiter mit der ursprünglichen Reihenfolge arbeiten sollen. Das gilt auch, wenn mehrere Views auf denselben Puffer zeigen: Ein reverse() würde alle diese Views gleichzeitig verändern.

Rückgabewert

Typ
TypedArray
Beschreibung
Ein neues typisiertes Array vom gleichen Typ und gleicher Länge wie das Original, mit den Elementen in umgekehrter Reihenfolge und einem eigenen, neu angelegten ArrayBuffer.

Beispiele

Grundlegende Nutzung: Original bleibt erhalten

const werte = new Uint8Array([1, 2, 3, 4, 5]);
const umgekehrt = werte.toReversed();

console.log(umgekehrt); // neue Kopie
console.log(werte);     // unverändert
console.log(umgekehrt instanceof Uint8Array);
Uint8Array(5) [5, 4, 3, 2, 1] Uint8Array(5) [1, 2, 3, 4, 5] true

Unterschied zu reverse() bei geteiltem Puffer

const buffer = new ArrayBuffer(4);
const a = new Uint8Array(buffer);
const b = new Uint8Array(buffer); // zweite View auf denselben Speicher
a.set([10, 20, 30, 40]);

const kopie = a.toReversed();
console.log(b);                           // unberührt
console.log(kopie.buffer === buffer);     // eigener Puffer

a.reverse();                              // mutiert den geteilten Puffer
console.log(b);
Uint8Array(4) [10, 20, 30, 40] false Uint8Array(4) [40, 30, 20, 10]

Audio-Samples rückwärts abspielen (Web Audio)

const ctx = new AudioContext();

const playReversed = (audioBuffer) => {
  const reversedBuffer = ctx.createBuffer(
    audioBuffer.numberOfChannels,
    audioBuffer.length,
    audioBuffer.sampleRate
  );
  for (let ch = 0; ch < audioBuffer.numberOfChannels; ch++) {
    // Float32Array des Originals bleibt unverändert
    const samples = audioBuffer.getChannelData(ch).toReversed();
    reversedBuffer.copyToChannel(samples, ch);
  }
  const source = ctx.createBufferSource();
  source.buffer = reversedBuffer;
  source.connect(ctx.destination);
  source.start();
};

Feature-Erkennung mit Fallback

const reverseCopy = (ta) =>
  typeof ta.toReversed === 'function'
    ? ta.toReversed()
    : ta.slice().reverse(); // slice() kopiert ebenfalls in einen neuen Puffer

console.log(reverseCopy(new Int16Array([-1, 0, 1])));
Int16Array(3) [1, 0, -1]

// Wichtig · Fallstricke

  • Kompatibilität: Die Methode gibt es erst seit ES2023. Ältere Browser und Node.js vor Version 20 kennen sie nicht. Als Fallback eignet sich ta.slice().reverse().
  • Speicherbedarf: Es wird immer ein vollständiger neuer Puffer angelegt. Bei sehr großen Daten, etwa mehreren hundert MB, verdoppelt sich also kurzzeitig der Speicherverbrauch. Wenn keine Kopie nötig ist, ist reverse() sparsamer.
  • Die Kopie verwendet immer einen normalen ArrayBuffer, auch wenn das Original auf einem SharedArrayBuffer liegt. Außerdem enthält sie nur den Ausschnitt der View (byteOffset/length) und nicht den ganzen Quellpuffer.
  • Der Rückgabetyp entspricht dem Konstruktor des Originals. Symbol.species wird dabei nicht berücksichtigt, anders als bei slice() oder map().
  • Ist der Puffer des Originals abgekoppelt (detached), zum Beispiel nach einem Transfer per postMessage, wirft der Aufruf einen TypeError.