Cette fonction est expérimentale
Puisque cette fonction est toujours en développement dans certains navigateurs, veuillez consulter le tableau de compatibilité pour les préfixes à utiliser selon les navigateurs.
Il convient de noter qu'une fonctionnalité expérimentale peut voir sa syntaxe ou son comportement modifié dans le futur en fonction des évolutions de la spécification.

La méthode statique ArrayBuffer.transfer() renvoie un nouvel objet ArrayBuffer dont le contenu a été transféré depuis les données d'ancienBuffer et qui est soit tronqué soit complété avec des zéros pour que la longueur du nouvel objet soit égale à nouvelleLongueur. Si nouvelleLongueur vaut undefined, on utilisera la propriété byteLength de l'ancienBuffer. Cette opération fait que ancienBuffer sera dans un état détaché.

Syntaxe

ArrayBuffer.transfer(ancienBuffer [, nouvelleLongueur]);

Paramètres

ancienBuffer
Un objet ArrayBuffer à partir duquel on souhaite transférer des données.
nouvelleLongueur
La longueur, exprimée en octets, du nouvel objet ArrayBuffer.

Valeur de retour

Un nouvel objet ArrayBuffer.

Description

La méthode ArrayBuffer.transfer() permet d'agrandir et de détacher des objets ArrayBuffer. Le fait de pouvoir agrandir un ArrayBuffer sans effectuer de copie permet d'être beaucoup plus efficace sur les grands buffers (comme pour realloc). Le fait de pouvoir détacher un ArrayBuffer permet au développeur d'avoir un contrôle explicite sur la mémoire sous-jacente et sa libération. Cela permet d'éviter d'avoir à libérer toutes les références et d'attendre le travail du ramasse-miettes.

Exemples

var buf1 = new ArrayBuffer(40);
new Int32Array(buf1)[0] = 42;

var buf2 = ArrayBuffer.transfer(buf1, 80);
buf1.byteLength; // 0 (attention, avec la prothèse, la valeur sera toujours 40)
buf2.byteLength; // 80
new Int32Array(buf2)[0]; // 42

var buf3 = ArrayBuffer.transfer(buf2, 0);
buf2.byteLength; // 0 (attention, avec la prothèse, la valeur sera toujours 80)
buf3.byteLength; // 0

Prothèse d'émulation (polyfill)

Ce fragment de code permet d'obtenir la plupart des fonctionnalités de transfer() dans un environnement qui ne le prend pas en charge nativement. Attention, cela ne correspond pas exactement à l'API mais permet de transférer des données d'un ArrayBuffer vers un autre.

if (!ArrayBuffer.transfer) {
    ArrayBuffer.transfer = function(source, length) {
        if (!(source instanceof ArrayBuffer))
            throw new TypeError('Source must be an instance of ArrayBuffer');
        if (length <= source.byteLength)
            return source.slice(0, length);
        var sourceView = new Uint8Array(source),
            destView = new Uint8Array(new ArrayBuffer(length));
        destView.set(sourceView);
        return dest.buffer;
    };
}

Spécifications

Spécification État Commentaires
Proposition pour ArrayBuffer.prototype.transfer Brouillon Brouillon de niveau 2

Compatibilité des navigateurs

Update compatibility data on GitHub
OrdinateurMobileServeur
ChromeEdgeFirefoxInternet ExplorerOperaSafariWebview AndroidChrome pour AndroidEdge MobileFirefox pour AndroidOpera pour AndroidSafari sur iOSSamsung InternetNode.js
Support simple
ExpérimentaleNon-standard
Chrome Aucun support NonEdge Aucun support NonFirefox Aucun support NonIE Aucun support NonOpera Aucun support NonSafari Aucun support NonWebView Android Aucun support NonChrome Android Aucun support NonEdge Mobile Aucun support NonFirefox Android Aucun support NonOpera Android Aucun support NonSafari iOS Aucun support NonSamsung Internet Android Aucun support Nonnodejs Aucun support Non

Légende

Aucun support  
Aucun support
Fonctionnalité expérimentale. Celle-ci peut être amenée à changer par la suite.
Fonctionnalité expérimentale. Celle-ci peut être amenée à changer par la suite.
Fonctionnalité non-standard. Celle-ci peut être incorrectement supportée par les autres navigateurs.
Fonctionnalité non-standard. Celle-ci peut être incorrectement supportée par les autres navigateurs.

Voir aussi

Étiquettes et contributeurs liés au document

Contributeurs à cette page : SphinxKnight
Dernière mise à jour par : SphinxKnight,