Quelle est la différence entre une copie peu profonde et une copie en profondeur avec des tableaux JavaScript?

Selon la documentation MDN appelant array.slice() va créer une copie peu profonde du tableau.

Voir ce lien MDN pour tranche () .

Cependant, si je lance un test simple en tant que tel dans la console:

 var test = [[1,2,3],7,8,9]; var shallow_copy = test.slice(); 

Et inspecter la copie superficielle, je peux voir que l'ensemble du tableau bidimensionnel semble être copié.

Quelle est la différence entre une copie peu profonde et une copie en profondeur? Si je devais deviner, j'aurais appellé cela une copie en profondeur.

Pour voir la différence, essayez:

 shallow_copy[0][2] = 4; console.dir(test); 

Vous verrez que ce test a été modifié! C'est parce que pendant que vous avez peut-être copié les valeurs sur le nouveau tableau, le tableau imbriqué est toujours le même.

Une copie en profondeur effectuerait récursivement des copies peu profondes jusqu'à ce que tout soit une nouvelle copie de l'original.

Fondamentalement, vous obtenez simplement une référence à la variable / tableau d'origine. La modification de la référence changera également le tableau d'origine. Vous devez contourner les valeurs du tableau d'origine et former une copie.

Considérons cet exemple:

 var orig = { a: 'A', b: 'B', c: 'C' }; 

Disons que vous voulez créer un double de ceci, de sorte que même si vous modifiez les valeurs d'origine, vous pouvez toujours revenir à l'original.

Je peux le faire:

 var dup = orig; //Shallow copy! 

Si nous changeons de valeur:

 dup.a = 'Apple'; 

Cette déclaration changera également d' orig , puisque nous avons une copie peu profonde ou une référence à var orig . Cela signifie que vous perdez également les données d'origine.

Mais, en créant une nouvelle variable en utilisant les propriétés de la variable originale orig , vous pouvez créer une copie en profondeur.

 var dup = { a: orig.a, b: orig.b, c: orig.c }; //Deep copy! 

Maintenant, si vous modifiez dup.a , cela affectera seulement dup et non orig .