Movatterモバイル変換


[0]ホーム

URL:


MDN Web Docs

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

L’algorithme de clonage structuré

L'algorithme de clonage structuré est un nouvel algorithmedéfini par la spécification HTML5 pour sérialiser les objets JavaScript complexes. Il est plus puissant queJSON en cela qu'il supporte la sérialisation d'objets contenant des graphes cycliques — des objets peuvent faire référence à des objets faisant référence à d'autres objets dans le même 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-même un objet avec des champs, ces champs sont parcourus de manière récursive jusqu'à ce que chaque champ et sous-champ aient été copié dans le nouvel objet.

Avantages par rapport à JSON

Il y a quelques avantages notables à utiliser l'algorithme de clonage structuré plutôt que JSON :

  • Le clonage structuré peut copier des objetsRegExp.
  • Le clonage structuré peut copier des objetsBlob,File etFileList.
  • Le clonage structuré peut copier des objetsImageData. Les dimensions duCanvasPixelArray du clone correspondront à celles de l'original, et il recevra une copie des mêmes données de pixels.
  • Le clonage structuré copie correctement les objets contenant des graphes de références cycliques.

Ce qui ne marche pas avec le clonage structuré

  • Les objetsError etFunction ne peuvent pas être copiés par l'algorithme de clonage structuré ; toute tentative de le faire émettra une exceptionDATA_CLONE_ERR.
  • De la même manière, toute tentative de cloner des nœuds DOM émettra une exceptionDATA_CLONE_ERR.
  • Certains paramètres d'objets ne sont pas préservés :
    • Le champlastIndex des objetsRegExp n'est pas préservé.
    • Les descripteurs de propriétés, accesseurs et mutateurs (ainsi que les fonctionnalités de métadonnées similaires) ne sont pas copiés. Par exemple, si un objet est marqué en lecture seulevia un descripteur de propriété, il sera en lecture et écriture dans le clone, car c'est la condition par défaut.
    • La chaîne de prototypes n'est ni parcourue, ni copiée.

Types supportés

Type d'objetNotes
Tous types primitifsÀ l'exception des symboles
ObjetBooléen
Objet String
Date
RegExpLe champlastIndex n'est pas préservé
Blob
File
FileList
ArrayBuffer
ArrayBufferViewCe qui implique tous lestableaux typés tels queInt32Array, etc.
ImageData
Array
ObjectInclut seulement les objets plats (par ex. depuis un objet littéral)
Map
Set

Alternative : copie profonde

Si vous voulez unecopie profonde d'un objet (c'est-à-dire une copie récursive de toutes les propriétés imbriquées, en parcourant la chaîne 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 spéciaux.  var Constructor = objectToBeCloned.constructor;  switch (Constructor) {    // Implémenter d’autres objets spéciaux ici.    case RegExp:      objectClone = new Constructor(objectToBeCloned);      break;    case Date:      objectClone = new Constructor(objectToBeCloned.getTime());      break;    default:      objectClone = new Constructor();  }  // Clone chaque propriété.  for (var prop in objectToBeCloned) {    objectClone[prop] = clone(objectToBeCloned[prop]);  }  return objectClone;}

Note :Cet algorithme ne prend en charge que les objets spéciauxRegExp,Array etDate. Vous pouvez implémenter d'autres cas spéciaux selon vos besoins.

Voir aussi

Help improve MDN

Learn how to contribute.

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp