Java Script dlaczego tablice dziwiwnie działają?

0

Robie sobie pewną część generowania mojego sudoku w JS i natrafiłem na problem.
Ale pytanie dotyczy wyłącznie dziwnego zachowania wartości w moich tablicach.
Nie mam pojęcia dlaczego tablice "elem" i "element" mają takie same wartości.

 
var element; // undefined
var elem; // undefined
function foo(table) // jakaś tablica
{
 element = table; // kopia tej tablicy
 do
 {
  ...
  element[y][x] = "";
  elem = element; // kopia do operacji na nej
  cos = foo2();
  ...
 }
 while(cos == false)
 return element;
}
function foo2()
{
 ...
 // tu się dzieją dziwne rzeczy dla przykładu holder = 1 (i,x,yy,xx - pozycje w tablicy "mało istotne")
 console.log("element(1,6):",element[yy][xx],elem[i][x]); // pokazuje: element(1,6):  -to się zgadza
 elem[i][x] = holder; // przypisanie do elem[i][x] wartości holder(czyli 1)
 console.log("element(1,7):",element[yy][xx],elem[i][x]); pokazuje: element(1,7): 1(dlaczego 1?) 1(to jest ok) -nie mam pojęcia jak to się stało...
 element[yy][xx] = ""; // to jest dla testu 
 console.log("element(1,8):",element[yy][xx],elem[i][x]); // pokazuje: element(1,8): (dlaczego elem[i][x] też = ""?)-???
 ...
}

1

elem = element; // kopia do operacji na nej - to nie kopia tylko referencja, wszystkie typy złożone przekazywane są w JS przez referencję a nie przez wartość.

Kopię tablicy robisz tak:
var arrCopy = arr.slice(0)
lub w ES+ tak:
const arrCopy = [...arr]

To ci zrobi kopię, ale tylko jednego poziomu, jak masz tablicę tablic to musisz użyć czegoś w stylu cloneDeep - dostępne np w Lodashu i innych bibliotekach.

1

element = table; // kopia tej tablicy to nie kopia a referencja. Więc w tej linii element[y][x] = ""; modyfikujesz wartość tablica również. Poza tym lepiej unikać zmiennych globalnych.

0

Wiedziałem że pewnie zrobiłem strasznie glupi błąd. Dziękuje za odpowiedź.

1 użytkowników online, w tym zalogowanych: 0, gości: 1