Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET
Nauč se s námi víc. Využij 50% zdarma na e-learningové kurzy.
discount week 50
Avatar
Jan Hořínek:15. září 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. září 8:26
Avatar
Nahoru Odpovědět
15. září 9:24
/* I am not sure why this works but it fixes the problem */
Avatar
Jiří Satora
Redaktor
Avatar
Jiří Satora:15. září 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. září 9:27
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:15. září 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. září 10:33
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:15. září 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. září 11:17
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:15. září 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. září 11:28
 
Nahoru Odpovědět
15. září 11:26
Avatar
Jan Hořínek:15. září 14:04

Moc vám všem děkuji.

 
Nahoru Odpovědět
15. září 14:04
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 7 zpráv z 7.