2014-07-01 17 views
10

Według dokumentacji MDN wywołanie array.slice() spowoduje utworzenie płytkiej kopii tablicy.Jaka jest różnica między płytką kopią i głęboką kopią z tablicami JavaScript?

Zobacz to MDN link for slice().

Jednakże, jeśli mogę uruchomić prosty test jako taki w konsoli:

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

i wglądu shallow_copy, widzę, że cała 2 wymiarowa tablica wydaje się być kopiowane.

Jaka jest różnica między płytką kopią a głęboką kopią? Gdybym miał zgadywać, nazwałbym to głęboką kopią.

+0

Oznacza to, że 'test [0] === shallow_copy [0]', odnoszą się do tego samego obiektu tablicy. – Bergi

+0

Uważam, że użycie słowa "płytkie" i "głębokie" jest całkowicie mylące w dokumentacji JavaScript, ponieważ zostało już powiedziane, że obiekty nigdy nie są kopiowane. Kiedy jednoznacznie brzmi "płytko", oczekiwałbym, że wszystkie elementy będą odniesieniami do tej samej rzeczy (w tym do obiektów, takich jak liczby), ale dotyczy to tylko obiektów, o których już wcześniej nie pisano. – destoryer

Odpowiedz

19

Aby zobaczyć różnicę, spróbuj:

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

Zobaczysz, że test został zmodyfikowany! Dzieje się tak, ponieważ podczas kopiowania wartości do nowej tablicy, zagnieżdżona tablica jest wciąż ta sama.

Głębokie kopie rekurencyjnie wykonują płytkie kopie, dopóki wszystko nie będzie nową kopią oryginału.

2

Zasadniczo otrzymujesz referencję do oryginalnej zmiennej/tablicy. Zmiana odniesienia spowoduje także zmianę oryginalnej tablicy. Musisz zapętlić wartości oryginalnej tablicy i utworzyć kopię.

Rozważmy następujący przykład:

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

Powiedzmy chcesz utworzyć duplikat to tak, że nawet jeśli zmienisz oryginalne wartości, zawsze można wrócić do oryginału.

mogę to zrobić:

var dup = orig; //Shallow copy! 

Jeśli zmienimy wartość:

dup.a = 'Apple'; 

To stwierdzenie będzie również zmienić a z orig, ponieważ mamy płytką kopię lub odniesienie do var orig. Oznacza to, że tracisz również oryginalne dane.

Ale tworząc całkiem nową zmienną, korzystając z właściwości oryginalnej zmiennej orig, można utworzyć głęboką kopię.

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

Teraz po zmianie dup.a, to będzie tylko wpływa dup i nie orig.

+4

To nie jest płytka kopia. To wcale nie jest kopia. –

+0

Mogę się mylić, prosimy o poprawienie! Tego nauczyłem się ze starego doświadczenia. –

+1

To jest po prostu przekazanie odniesienia nie płytkiej lub głębokiej kopii. Sprawdź najlepszą odpowiedź na stronie: http://stackoverflow.com/questions/184710/what-is-the-difference-between-a-deep-copy-and-a-shallow-copy na różnicę między płytką a głęboką kopią . To, co w swoim przykładzie nazywasz "głęboką kopią", jest w rzeczywistości płytkie – elachell

Powiązane problemy