[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/fr/docs/Web/API/Web_Workers_API/Structured_clone_algorithm [Back]  [Original]

Lalgorithme de clonage structur - Les API Web | MDN

Cette page a t traduite partir de l'anglais par la communaut. Vous pouvez contribuer en rejoignant la communaut francophone sur MDN Web Docs.

View in English Always switch to English

Lalgorithme de clonage structur

L'algorithme de clonage structur est un nouvel algorithme dfini par la spcification HTML5 pour srialiser les objets JavaScript complexes. Il est plus puissant que JSON en cela qu'il supporte la srialisation d'objets contenant des graphes cycliques des objets peuvent faire rfrence des objets faisant rfrence d'autres objets dans le mme graphe. De plus, dans certains cas, l'algorithme de clonage structur peut tre plus efficace que JSON.

L'algorithme, essentiellement, parcourt tous les champs de l'objet original, copiant les valeurs de chaque champ dans un nouvel objet. Si un champ est lui-mme un objet avec des champs, ces champs sont parcourus de manire rcursive jusqu' ce que chaque champ et sous-champ aient t copi dans le nouvel objet.

Dans cet article

Avantages par rapport JSON

Il y a quelques avantages notables utiliser l'algorithme de clonage structur plutt que JSON :

  • Le clonage structur peut copier des objets RegExp.
  • Le clonage structur peut copier des objets Blob, File et FileList.
  • Le clonage structur peut copier des objets ImageData. Les dimensions du CanvasPixelArray du clone correspondront celles de l'original, et il recevra une copie des mmes donnes de pixels.
  • Le clonage structur copie correctement les objets contenant des graphes de rfrences cycliques.

Ce qui ne marche pas avec le clonage structur

  • Les objets Error et Function ne peuvent pas tre copis par l'algorithme de clonage structur ; toute tentative de le faire mettra une exception DATA_CLONE_ERR.
  • De la mme manire, toute tentative de cloner des nuds DOM mettra une exception DATA_CLONE_ERR.
  • Certains paramtres d'objets ne sont pas prservs :
    • Le champ lastIndex des objets RegExp n'est pas prserv.
    • Les descripteurs de proprits, accesseurs et mutateurs (ainsi que les fonctionnalits de mtadonnes similaires) ne sont pas copis. Par exemple, si un objet est marqu en lecture seule via un descripteur de proprit, il sera en lecture et criture dans le clone, car c'est la condition par dfaut.
    • La chane de prototypes n'est ni parcourue, ni copie.

Types supports

Type d'objet Notes
Tous types primitifs l'exception des symboles
Objet Boolen
Objet String
Date
RegExp Le champ lastIndex n'est pas prserv
Blob
File
FileList
ArrayBuffer
ArrayBufferView Ce qui implique tous les tableaux typs tels que Int32Array, etc.
ImageData
Array
Object Inclut seulement les objets plats (par ex. depuis un objet littral)
Map
Set

Alternative : copie profonde

Si vous voulez une copie profonde d'un objet (c'est--dire une copie rcursive de toutes les proprits imbriques, en parcourant la chane des prototypes), vous devez employer une autre approche. Ce qui suit est un exemple possible.

js
function clone(objectToBeCloned) {
  // Cas basique.
  if (!(objectToBeCloned instanceof Object)) {
    return objectToBeCloned;
  }

  var objectClone;

  // Filtre les objets spciaux.
  var Constructor = objectToBeCloned.constructor;
  switch (Constructor) {
    // Implmenter dautres objets spciaux ici.
    case RegExp:
      objectClone = new Constructor(objectToBeCloned);
      break;
    case Date:
      objectClone = new Constructor(objectToBeCloned.getTime());
      break;
    default:
      objectClone = new Constructor();
  }

  // Clone chaque proprit.
  for (var prop in objectToBeCloned) {
    objectClone[prop] = clone(objectToBeCloned[prop]);
  }

  return objectClone;
}

Note : Cet algorithme ne prend en charge que les objets spciaux RegExp, Array et Date. Vous pouvez implmenter d'autres cas spciaux selon vos besoins.

Voir aussi


Web Proxy Viewer  |  New URL  |  Original Page