Destructuring - czyli działa, mimo że nie powinno

0

Cześć
Przeglądając swój kod zauważyłem pewien fragment który
spełnia dobrze swoją funkcje. Problem w tym że z tego co wiem nie powinien w ogóle działać, a działa.
Już wyjaśniam:

import { generalTab } from "./general_tab";
import { parameters } from "./parameters";

export function createSeeTab() {
  let { l, p, g, d, seeTab, hero } = parameters;
  let x = hero[0];
  let y = hero[1];
  for (let j = 0; j <= g + d; j++) {
    for (let i = 0; i <= l + p; i++) {
      let tabl = generalTab[x - l + i] && generalTab[x - l + i][y - g + j];
      seeTab[i][j] = tabl;
    }
  }
  seeTab[2][2] = "hero";
  execute();
}

Przypisuje nową wartość do seeTab które powstało z destrukturyzacji parameters.
O dziwo zmienia mi się obiekt parameters
Z tego co wiem powinna się zmienić tylko lokalna zmienna seeTab a tak nie jest.
Projekt działa z webpackiem.

Czy ktoś wie dla czego to tak działa ?

3

Przypisuje nową wartość do seeTab które powstało z destrukturyzacji parameters.

No nie. Jakbyś tak robił:

seeTab = NOWA_WARTOSC

to faktycznie byłoby dziwne. Ale ty idziesz w głąb:

seeTab[2][2] = "hero";

czyli wcale nie przypisujesz nowej wartości do zmiennej seeTab, tylko raczej używasz seeTab, żeby dostać się głębiej, najpierw do trzeciego elementu tablicy (seeTab[2]), a potem bierzesz tę tablicę i zmieniasz jej trzeci element na "hero".

To trochę jakbyś napisał tak:

const deeper = seeTab[2];
deeper[2] = "hero";

Tylko, że:

  1. referencja do obiektu parameters nie powinna się zmienić. Weź sobie zapisz gdzieś na początku
    oldParameters = parameters

a potem

console.log(oldParameters === parameters);

powinno być true (o ile dobrze zanalizowałem ten kod, który napisałeś).

  1. ale gdzieś tam w środku zmieniają się dane, ponieważ zmieniasz dane "in place" gdzieś tam głęboko.
0

Edit:
Sprawdziłem. Zwraca true, czyli referencja się nie zmieniła.
Faktycznie.
Zapomniałem że parameters to typ referencyjny ale paremeters.seeTab[0][0] to typ prosty.
Dzięki za pomoc.

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