Zainicjowałem kilka zmiennych w zakresie globalnym w pliku JavaScript:
var moveUp, moveDown, moveLeft, moveRight;
var mouseDown, touchDown;
Muszę ustawić wszystkie te zmienne na false, to jest kod, który obecnie mam:
moveUp = false;
moveDown = false;
moveLeft = false;
moveRight = false
mouseDown = false;
touchDown = false;
Czy istnieje sposób, w jaki mogę ustawić wszystkie te zmienne na tę samą wartość w jednym wierszu kodu, czy też kod, który obecnie mam najlepszy sposób, aby to zrobić
javascript
SUB-HDR
źródło
źródło
Odpowiedzi:
Nic cię nie powstrzymuje
Sprawdź ten przykład
źródło
function MyObj(){this.x=1} var a,b; a = b = new MyObj(); ++a.x
zwiększy równieżb.x
właściwość.Nic nie powstrzymuje Cię przed zrobieniem powyższego, ale poczekaj!
Jest kilka pułapek. Przypisanie w Javascript jest od prawej do lewej, więc kiedy piszesz:
skutecznie przekłada się na:
co skutecznie przekłada się na:
Nieumyślnie właśnie utworzyłeś 5 zmiennych globalnych - jestem pewien, że nie chciałeś tego robić.
Uwaga: Mój powyższy przykład zakłada, że uruchamiasz swój kod w przeglądarce, stąd
window
. Gdybyś był w innym środowisku, te zmienne byłyby dołączone do dowolnego kontekstu globalnego dla tego środowiska (tj. W Node.js, byłyby one dołączone doglobal
kontekstu globalnego tego środowiska).Teraz możesz najpierw zadeklarować wszystkie swoje zmienne, a następnie przypisać im tę samą wartość, aby uniknąć problemu.
Krótko mówiąc, oba sposoby działałyby dobrze, ale pierwszy sposób może potencjalnie wprowadzić do kodu zgubne błędy. Nie popełniaj grzechu zaśmiecania globalnej przestrzeni nazw zmiennymi lokalnymi, jeśli nie jest to absolutnie konieczne.
Uwaga dodatkowa: Jak wskazano w komentarzach (i to nie tylko w przypadku tego pytania), jeśli skopiowana wartość nie była wartością pierwotną, ale obiektem, lepiej wiesz o kopiowaniu według wartości w porównaniu z kopiowaniem przez odniesienie. Przy przypisywaniu obiektów zamiast rzeczywistego obiektu kopiowane jest odniesienie do obiektu. Wszystkie zmienne będą nadal wskazywały na ten sam obiekt, więc każda zmiana jednej zmiennej zostanie odzwierciedlona w innych zmiennych i spowoduje duży ból głowy, jeśli zamierzałeś skopiować wartości obiektu, a nie odniesienie.
źródło
moveUp
tym, że ma zasięg blokowy, nie miałoby to znaczenia. 5 zmiennych globalnych nadal byłoby zadeklarowanych.var a, b, c; a = b = c = 10;
bardzo różni się odvar a = b = c = 10;
. Tak więc przyjęta odpowiedź jest prawidłowa. Rozwiązujesz problem niezwiązany z zaakceptowaną odpowiedzią.Istnieje inna opcja, która nie wprowadza globalnych problemów podczas próby zainicjowania wielu zmiennych na tę samą wartość. To, czy jest to lepsze od długiej drogi, czy nie, jest decyzją sądu. Prawdopodobnie będzie wolniejszy i może, ale nie musi, być bardziej czytelny. W twoim konkretnym przypadku myślę, że długa droga jest prawdopodobnie bardziej czytelna i łatwa w utrzymaniu, a także jest szybsza.
Inny sposób wykorzystuje zadanie rozpad .
To pozwala zainicjować zestawu
var
,let
lubconst
zmienne do tej samej wartości w jednym wierszu wszystkie z tego samego zakresu oczekiwanego.Bibliografia:
MDN: Array Global Object
MDN: Array.fill
źródło
same
obiektu. Modyfikacje jednego wpłyną na inne…Umieść zmienną w tablicy i użyj pętli for, aby przypisać tę samą wartość do wielu zmiennych.
źródło