Quelle est la différence entre la copie profonde et la copie superficielle en JS ? Des exemples de code spécifiques sont nécessaires
En JavaScript, il existe deux méthodes de copie d'objets : la copie superficielle et la copie profonde. Une copie superficielle copie uniquement l'adresse de référence d'un objet, tandis qu'une copie profonde crée une copie complètement indépendante.
La copie superficielle consiste à copier l'adresse de référence de l'objet d'origine vers le nouvel objet. Ils pointent vers le même espace mémoire. Lorsque les propriétés de l'un des objets sont modifiées, les propriétés correspondantes de l'autre objet seront également modifiées. C'est parce qu'ils partagent la même adresse mémoire.
La copie approfondie consiste à créer un tout nouvel objet et à copier tous les attributs de l'objet d'origine vers le nouvel objet un par un. Le nouvel objet et l'objet d'origine n'ont aucune influence l'un sur l'autre. Même si vous modifiez les propriétés d'un objet, les propriétés de l'autre objet ne seront pas affectées.
Ci-dessous, j'illustrerai la différence entre la copie superficielle et la copie profonde à travers des exemples de code spécifiques.
Tout d'abord, regardons un exemple de copie superficielle :
let obj1 = {name: "Alice", age: 20}; let obj2 = obj1; obj1.age = 21; console.log(obj1); // {name: "Alice", age: 21} console.log(obj2); // {name: "Alice", age: 21}
Dans le code ci-dessus, nous implémentons une copie superficielle en attribuant obj1
à obj2
. Lorsque l'attribut age
de obj1
est modifié, l'attribut age
de obj2
est également modifié car ils pointent vers le même adresse mémoire. obj1
赋值给obj2
实现了一个浅拷贝。当修改obj1
的age
属性时,obj2
的age
属性也被修改了,这是因为它们指向同一块内存地址。
接下来,我们来看一个深拷贝的示例:
function deepClone(obj) { if (obj === null || typeof obj !== 'object') { return obj; } let clone = Array.isArray(obj) ? [] : {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { clone[key] = deepClone(obj[key]); } } return clone; } let obj1 = {name: "Alice", age: 20}; let obj2 = deepClone(obj1); obj1.age = 21; console.log(obj1); // {name: "Alice", age: 21} console.log(obj2); // {name: "Alice", age: 20}
在上述代码中,我们定义了一个deepClone
函数,用于实现深拷贝。该函数首先判断传入的参数是否为null或不是对象类型,如果是则直接返回,否则创建一个与传入对象类型相同的空对象clone
。然后通过遍历原对象的属性,递归调用deepClone
函数对每个属性进行深拷贝,并赋值给相应的clone
属性。最后返回新对象clone
。
通过使用deepClone
函数,我们实现了对obj1
的深拷贝。即使修改了obj1
的age
属性,但obj2
的age
rrreee
Dans le code ci-dessus, nous définissons une fonctiondeepClone
pour implémenter la copie profonde. Cette fonction détermine d'abord si le paramètre transmis est nul ou n'est pas un type d'objet. Si tel est le cas, elle renvoie directement. Sinon, elle crée un objet vide clone
du même type que l'objet transmis. . Ensuite, en parcourant les propriétés de l'objet d'origine, en appelant récursivement la fonction deepClone
pour copier en profondeur chaque propriété, et l'attribuer à la propriété clone
correspondante. Enfin, le nouvel objet clone
est renvoyé. 🎜🎜En utilisant la fonction deepClone
, nous implémentons une copie complète de obj1
. Même si l'attribut age
de obj1
est modifié, l'attribut age
de obj2
reste inchangé car ils sont deux complètement objets indépendants. 🎜🎜En résumé, la copie superficielle ne copie que l'adresse de référence de l'objet, tandis que la copie profonde crée une copie complètement indépendante. La copie approfondie peut garantir que l'objet d'origine ne sera pas affecté lors de la modification de l'objet de copie et convient à la copie d'objets avec des structures imbriquées. Il convient de noter que dans le développement réel, la copie approfondie peut entraîner une surcharge importante en termes de performances, il est donc nécessaire de choisir une méthode de copie appropriée en fonction de la situation réelle. 🎜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!