• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

.push afektuje na prawą stronę przypisania

42 Warsaw Coding Academy
0 głosów
217 wizyt
pytanie zadane 24 września 2018 w JavaScript przez LCPGM Obywatel (1,550 p.)

Witam mam problem z przypisywanie zmiennych w JSie. Mój kod wygląda tak:

var tablica = [];
var tablica2 = tablica;
tablica2.push("witam");
console.log(tablica2); // ["witam"]
console.log(tablica); // ["witam"]

Moje pytanie dotyczy tego dlaczego po pushowaniu jakiegoś elementu do "tablica2" afektuje on na "tablica", na którą nie powinien mieć wpływu, oraz dodaje do niej jakiś index.

Trochę już szukam i nie mogę nigdzie znaleźć na to odpowiedzi, ani rozwiązania. Dziękuje za pomoc!

2 odpowiedzi

+2 głosów
odpowiedź 24 września 2018 przez Tomek Sochacki Ekspert (227,490 p.)

Dzieje się tak, ponieważ w tablica2 przypisujesz nie tablicę jako wartość tylko po prostu referencję do niej. Jeśli chcesz stworzyć kopię tablicy (zawierającej elementy będące wartościami typu prostego jak string, number, boolean itp.) to najlepiej zrobić to poprzez:

const arr1 = [1,2,3];
const arr2 = [...arr1];

arr2.push(4); //4

arr1; //[1, 2, 3]
arr2; //[1, 2, 3, 4]

Alternatywnie można też użyć metody Array.from albo metody Array.prototype.slice.

Co innego jeśli w tablicy przechowujesz obiekty, wtedy sprawa się nieco komplikuje. Można to rozwiązać na parę sposobów, na przykład przy użyciu globalnego obiektu JSON:

const arr1 = [ /* obiekty */ ];
const arr2 = JSON.parse(JSON.stringify(arr1));

Rozwiązanie to działa jeśli nie nakombinujesz nadmiernie z elementami tablicy, czyli jeśli np. nie używasz deskryptorów, ale to raczej nie jest często spotykana praktyka.

Jakiś czas temu pisałem też artka o tym na moim blogu jakbyś był zainteresowany: http://poradnik.drogimex.pl/2018/04/25/stworzyc-kopie-tablicy-javascript/

+1 głos
odpowiedź 24 września 2018 przez thryndl Nałogowiec (30,470 p.)
W tablica2 nie tworzysz nowej tablicy z własnym miejscem w pamięci, a jedynie adres do tablica. Dlatego zmiana wartości w jednej z dwóch tablic powoduje zmianę w obu tablicach. Tak samo sprawa wyglada ze zmiennymi.
komentarz 24 września 2018 przez LCPGM Obywatel (1,550 p.)
var tekst = "witam"
var tekst2 = tekst
tekst2 += ":)"
console.log(tekst) // "witam"
console.log(tekst2) //"witam:)"

Właśnie ze stringami działa normalnie, chyba, że to przez to że używam += a nie funkcji. 

W każdym razie jest możliwość przypisywania przy okazji tworząc nowe miejsce w pamięci, oraz tablicę? 

1
komentarz 24 września 2018 przez thryndl Nałogowiec (30,470 p.)

Podobne pytania

0 głosów
0 odpowiedzi 175 wizyt
pytanie zadane 28 grudnia 2018 w JavaScript przez Maikeru Początkujący (250 p.)
0 głosów
2 odpowiedzi 185 wizyt
pytanie zadane 18 lipca 2018 w JavaScript przez mihalrudy Nowicjusz (200 p.)
0 głosów
0 odpowiedzi 198 wizyt
pytanie zadane 4 maja 2018 w JavaScript przez niezalogowany

93,389 zapytań

142,385 odpowiedzi

322,547 komentarzy

62,749 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...