Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akce až 50 % zdarma při nákupu e-learningu. Více informací:
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Slevovy týden 3/50
Avatar
Jan Hořínek:15.9.2021 8:26

Rád bych se zeptal proč to tak je.

var A = [1,2,3,4,5];
var B = A;
B.shift();

V tuto chvíli jsem odebral první prvek pole B, ale to samé se samovolně provedlo i v poli A.
Proč?

Zkusil jsem: Obešel jsem to takto:
var A = [1,2,3,4,5];
var B = A.slice();
B.shift();

Hodnota pole A v tomto případě zůstala stejná.

Chci docílit: Pochopit to.

 
Odpovědět
15.9.2021 8:26
Avatar
Nahoru Odpovědět
15.9.2021 9:24
/* I am not sure why this works but it fixes the problem */
Avatar
Jiří S.
Tvůrce
Avatar
Jiří S.:15.9.2021 9:27

Děje se to proto že objekty (tedy i pole) se předávají referencí. Proměnná jen odkazuje na nějakou adresu v paměti kde je pole uložené. Takže když napíšeš var B = A, přiřazuješ odkaz na stejnou adresu v paměti jiné proměnné.
Jinak namísto slice metody se dá použít i spread operátor. Mám o tom webové stránky, tak se můžeš kdyžtak podívat. :-)

 
Nahoru Odpovědět
15.9.2021 9:27
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:15.9.2021 10:33
var a,b;

A = 1
B = A // do B se zkopiruje hodnota z A

A = [1,2,3]
B = A // do B ze zkopiruje pointer / handle / ukazatel na pamet / adresa pameti pole, ktere je v A
A[0] = 5 // tak se zmeni soucasne i B[0]

A = function () {alert(123)}
B = A
B(); // B i a jsou ted stejna funkce
A();
A = function () {alert(456)}
Tak B je ted uplne jina funkce, protoze se provadi create new function, timto zapisem.

Pokud potrebujes pole zklonovat, tak si je zklonuj. Cyklem nebo pres prevodni funkce. Nekde pisi, ze se da pouzit Object.assign, ale to mi fungovalo nespolehlive.

function cloneArray(arr)
        {
        return JSON.parse(JSON.stringify(arr)); // note: Object.assign work bad
        }
 
Nahoru Odpovědět
15.9.2021 10:33
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:15.9.2021 11:17

Nebo pouzij to slice. To provadi take klonovani pole. Ale u slozitejsich poli to nemusi fungovat. Ikdyz, podle dokumentace, snad jo.
https://developer.mozilla.org/…/Array/slice

Nevim, ktery zpusob je rychlejsi. Nejrychlejsi by mel byt cyklus (spravne napsany).

 
Nahoru Odpovědět
15.9.2021 11:17
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:15.9.2021 11:26

https://www.samanthaming.com/…ne-an-array/
Tohle je taky zajimava stranka.

  • IE klonuje pole spesl zapisem.
  • A taky tam popisuji to prirazeni stejneho pametoveho mista s array do dvou promennych.
  • A tez tam pisou, jak je to nespolehlive, ze se muze stat presne to, co tobe i pri jejich klonovani
  • A zminuji dalsi cestu Array.from
const cloneSheeps = sheeps.slice(); // Old way
const cloneSheepsES6 = [...sheeps]; // ES6 way
const cloneSheeps = Array.from(sheeps); // Another Way to Clone Array
Editováno 15.9.2021 11:28
 
Nahoru Odpovědět
15.9.2021 11:26
Avatar
Jan Hořínek:15.9.2021 14:04

Moc vám všem děkuji.

 
Nahoru Odpovědět
15.9.2021 14:04
Avatar
JsonKody
Člen
Avatar
Odpovídá na Jan Hořínek
JsonKody:22.11.2021 8:10

Pole je objektovy typ a proto se predava pomocí reference.
Vysvětlení reference:

Vyrobil jsi proměnné A a B. Predstav si ze A je ruka. B je taky ruka. Pole je balónek. Ruka A ale nedrží přímo balónek drzi jen provazek k balonku. Kdyz jsi napsal B = A dal jsi jen do ruky B další provazek ke stejnému balonku. Takze akdyz treba ruka A balonek praskne ruka B ma take prasklý balonek ;)

 
Nahoru Odpovědět
22.11.2021 8:10
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.