Cette page a été traduite à partir de l'anglais par la communauté.Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.
ArrayBuffer : méthode transfer()
Baseline 2024Newly available
Depuis March 2024, cette fonctionnalité fonctionne sur les appareils et les versions de navigateur les plus récents. Elle peut ne pas fonctionner sur les appareils ou navigateurs plus anciens.
La méthodetransfer() des instances deArrayBuffer crée un nouveau tableau de mémoire tampon (array buffer en anglais) contenant les mêmes octets que ce tableau, puis détache ce tableau.
Dans cet article
Syntaxe
transfer()transfer(newByteLength)Paramètres
newByteLengthFacultatifLa longueur
byteLengthdu nouveau tableau de mémoire tampon. Par défaut, il s'agit de la valeur debyteLengthde ce tableau de mémoire tampon.- Si
newByteLengthest inférieur à la valeur debyteLengthde ce tableau de mémoire tampon, les octets « débordants » sont supprimés. - Si
newByteLengthest supérieur à la valeur debyteLengthde ce tableau de mémoire tampon, les octets supplémentaires sont remplis de zéros. - Si ce tableau de mémoire tampon est redimensionnable,
newByteLengthne doit pas dépasser sa valeur demaxByteLength.
- Si
Valeur de retour
Un nouvel objetArrayBuffer. Son contenu est initialisé avec le contenu de ceArrayBuffer, et les octets supplémentaires, le cas échéant, sont remplis de zéros. Le nouveauArrayBuffer est redimensionnable si, et seulement si, ceArrayBuffer est redimensionnable, auquel cas sa valeur demaxByteLength est la même que celle de ceArrayBuffer. LeArrayBuffer d'origine est détaché.
Exceptions
RangeErrorLevée si ce
ArrayBufferest redimensionnable et quenewByteLengthest supérieur à la valeur demaxByteLengthde ceArrayBuffer.TypeErrorLevée si ce
ArrayBufferest déjà détaché, ou s'il ne peut être détaché que par des opérations désignées. Actuellement, seules certaines API web sont capables de créer des objetsArrayBufferavec des méthodes de détachement désignées, commeGPUBuffer.getMappedRange()etWebAssembly.Memory.buffer.
Description
La méthodetransfer() effectue la même opération que l'algorithme de clonage structuré. Elle copie les octets de ceArrayBuffer dans un nouveauArrayBuffer, puis détache ceArrayBuffer. Voirtransfert des ArrayBuffer pour plus d'informations.
transfer() préserve la capacité de redimensionnement de ceArrayBuffer. Si vous souhaitez que le nouveauArrayBuffer ne soit pas redimensionnable, utilisez plutôttransferToFixedLength(). Il n'existe aucun moyen de transférer un buffer qui rend unArrayBuffer à longueur fixe redimensionnable.
transfer() est très efficace car les implémentations peuvent réaliser cette méthode comme un déplacement sans copie ou unrealloc — il n'est pas nécessaire de copier effectivement les données.
Exemples
>Transférer unArrayBuffer
// Crée un tableau de mémoire tampon et écrit quelques octetsconst buffer = new ArrayBuffer(8);const view = new Uint8Array(buffer);view[1] = 2;view[7] = 4;// Copie le tableau à la même tailleconst buffer2 = buffer.transfer();console.log(buffer.detached); // trueconsole.log(buffer2.byteLength); // 8const view2 = new Uint8Array(buffer2);console.log(view2[1]); // 2console.log(view2[7]); // 4// Copie le tableau à une taille plus petiteconst buffer3 = buffer2.transfer(4);console.log(buffer3.byteLength); // 4const view3 = new Uint8Array(buffer3);console.log(view3[1]); // 2console.log(view3[7]); // undefined// Copie le tableau à une taille plus grandeconst buffer4 = buffer3.transfer(8);console.log(buffer4.byteLength); // 8const view4 = new Uint8Array(buffer4);console.log(view4[1]); // 2console.log(view4[7]); // 0// Déjà détaché, lève une TypeErrorbuffer.transfer(); // TypeError: Cannot perform ArrayBuffer.prototype.transfer on a detached ArrayBufferTransférer unArrayBuffer redimensionnable
const buffer = new ArrayBuffer(8, { maxByteLength: 16 });const view = new Uint8Array(buffer);view[1] = 2;view[7] = 4;// Copie le tableau à une taille plus petiteconst buffer2 = buffer.transfer(4);console.log(buffer2.byteLength); // 4console.log(buffer2.maxByteLength); // 16const view2 = new Uint8Array(buffer2);console.log(view2[1]); // 2console.log(view2[7]); // undefinedbuffer2.resize(8);console.log(view2[7]); // 0// Copie le tableau à une taille plus grande dans la limite de maxByteLengthconst buffer3 = buffer2.transfer(12);console.log(buffer3.byteLength); // 12// Copie le tableau à une taille supérieure à maxByteLengthbuffer3.transfer(20); // RangeError: Invalid array buffer lengthSpécifications
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-arraybuffer.prototype.transfer> |