Maison > Article > interface Web > Copie superficielle et copie approfondie en JavaScript
En JavaScript, la copie d'objets ou de tableaux peut être classée en copie superficielle et copie profonde. Comprendre la différence est essentiel lorsqu'il s'agit de structures de données complexes, en particulier celles contenant des objets ou des tableaux imbriqués.
Ce guide explique ces concepts, leurs caractéristiques, les méthodes pour les mettre en œuvre et quand les utiliser.
Définition
Une copie superficielle crée une copie des propriétés de niveau supérieur d'un objet ou d'un tableau. Cependant, pour les objets ou tableaux imbriqués, seules les références sont copiées, pas les données réelles.
Caractéristiques
1.1 Utilisation d'Object.assign()
const original = { a: 1, b: { c: 2 } }; const shallowCopy = Object.assign({}, original); shallowCopy.b.c = 42; console.log(original.b.c); // OUTPUT: 42 (The original object also affected due to shared reference)
1.2 Utilisation de l'opérateur Spread (...)
const original = { a: 1, b: { c: 2 } }; const shallowCopy = { ...original }; shallowCopy.b.c = 90; console.log(original.b.c); // OUTPUT: 90
1.3 Voyons un exemple de copie superficielle sur les méthodes Array (slice, concat)
const original = [1, 2, [3, 4]]; const shallowCopy = original.slice(); shallowCopy[2][0] = 10; console.log(original[2][0]); // OUTPUT: 10
Définition
Une copie complète crée une copie totalement indépendante d'un objet ou d'un tableau. Tous les niveaux, y compris les structures imbriquées, sont copiés de manière récursive. Les modifications apportées à la structure copiée n'affectent pas l'original, et vice versa.
Caractéristiques
2.1 Utilisation de JSON.stringify() et JSON.parse()
const original = { a: 1, b: { c: 2 } }; const deepCopy = JSON.parse(JSON.stringify(original)); deepCopy.b.c = 42; console.log(original.b.c); // OUTPUT: 2 (original remains unaffected)
2.2 Utilisation de structuredClone()
Une méthode moderne de copie approfondie qui prend en charge les références circulaires et les objets spéciaux comme Date.
const original = { a: 1, b: { c: 2 }, date: new Date() }; const deepCopy = structuredClone(original); deepCopy.b.c = 42; console.log(original.b.c); // OUTPUT: 2 console.log(original.date === deepCopy.date); // FALSE
2.3 Utilisation d'une fonction récursive personnalisée
Une solution flexible pour traiter manuellement les cas complexes.
function deepCopy(obj) { if (obj === null || typeof obj !== "object") return obj; if (Array.isArray(obj)) return obj.map(deepCopy); const copy = {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { copy[key] = deepCopy(obj[key]); } } return copy; } const original = { a: 1, b: { c: 2 } }; const deepCopyObj = deepCopy(original); deepCopyObj.b.c = 42; console.log(original.b.c); // OUTPUT: 2
Copie superficielle
Copie approfondie
Copie superficielle
Copie approfondie
Ceci est une explication détaillée de la copie superficielle et de la copie profonde des objets dans JavaScript. Choisissez la méthode appropriée en fonction de votre cas d'utilisation et de vos exigences de performances.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!