Dziś krótki wpis. Uzupełnienie poprzedniego posta, opisującego podstawowe różnice pomiędzy typami prostymi a referencyjnymi.
Wyjaśniłem tam dlaczego nie możemy skopiować tablicy przy użyciu operatora ‚=’. Taka operacja przypisuje do zmiennej po lewej stronie operatora referencje do której prowadzi zmienna po prawej stronie. Nie kopiuje tablicy tak jak w przypadku zmiennych typu prostego, jak ‚number’ czy ‚boolean’.
Zamiast tego otrzymamy tak zwaną „płytką kopię” (shallow copy). Wszelkie zmiany, które program wykona w użyciu nowej płytkiej kopii, będą też odzwierciedlone w oryginale. Obie zmienne tak naprawdę wskazują na ten sam obiekt.
Dzieje się tak dlatego, że wszystkie obiekty w JavaScripcie (tablica też jest obiektem) są typami referencyjnymi. Jak się nad tym zastanowimy, ma to sens, ponieważ zamiast kopiować obiekt, lepiej jest stworzyć jego nową instancję za pomoc operatora ‚new’.
Z doświadczenia wiem jednak, że czasem przydaje się zrobić ‚głęboką kopię’ istniejącej już tablicy z całą jej zawartością. Skoro nie mamy takiej możliwości, to możemy stworzyć ją sobie sami!
Najpierw tworzymy funkcję. Jako argument przyjmuje ona tablicę, którą chcemy skopiować. Muszę tu zaznaczyć, że tablica przekazywana jako argument, jest też ‚płytką kopią’. Oznacza to, że zmiany na argumencie w funkcji, będą odzwierciedlone w zmiennej zewnętrznej. Niedługo napiszę więcej na ten temat, ale póki co, wystarczy wiedzieć, że jeżeli nie chcemy aby nasza oryginalna tablica była zmieniona przez funkcję, nie zmieniajmy wartości przekazywanego argumentu.
1 2 3 |
function deepArrayCopy(array) { } |
W funkcji będzie nam potrzebna zmienna tymczasowa, przechowująca naszą ‚głęboką kopię’.
1 2 3 |
function deepArrayCopy(array) { var newArray = []; } |
Pamiętamy o słówku ‚var’ aby nie stworzyć przypadkiem zmiennej globalnej 🙂 Następnie tworzymy pętlę FOR, która będzie iterować przez tablicę przekazaną jako argument funkcji.
1 2 3 4 5 6 |
function deepArrayCopy(array) { var newArray = []; for(var i=0;i<array.length;i++){ } } |
Teraz wystarczy w każdym kroku pętli przypisać wartość aktualnej iteracji tablicy z argumentu do naszej zmiennej tymczasowej.
1 2 3 4 5 6 |
function deepArrayCopy(array) { var newArray = []; for(var i=0;i<array.length;i++){ newArray[i] = array[i]; } } |
Na koniec pozostało nam tylko zwrócić nową tablicę i gotowe 🙂
1 2 3 4 5 6 7 |
function deepArrayCopy(array) { var newArray = []; for(var i=0;i<array.length;i++){ newArray[i] = array[i]; } return newArray; } |
A tak będzie nasza nowa funckja wyglądać w użyciu:
1 2 |
var psy = ["maja", "burek", "miluś", "rambo", "dżeki"]; var psyAux = deepArrayCopy(psy); |
I gotowe! Funkcja ta pomoże nam tworzyć głębokie kopie tablic.
Miłej zabawy z kodem 🙂
Siema
for(var i=0;i<array.length;i++)
Chyba powinno być:
for(var i =0; i<array.length;i++)