• 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

VPS Starter Arubacloud
0 głosów
156 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,510 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 141 wizyt
pytanie zadane 28 grudnia 2018 w JavaScript przez Maikeru Początkujący (250 p.)
0 głosów
2 odpowiedzi 134 wizyt
pytanie zadane 18 lipca 2018 w JavaScript przez mihalrudy Nowicjusz (200 p.)
0 głosów
0 odpowiedzi 143 wizyt
pytanie zadane 4 maja 2018 w JavaScript przez niezalogowany

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...