2016-08-04 26 views
8

ES6 mamy const.Warunkowo inicjowanie stałej w języku Javascript

To nie jest dozwolone: ​​

const x; //declare first 
//and then initialize it 
if(condition) x = 5; 
else x = 10; 

Ma to sens, ponieważ pozwala nam z użyciem stałej zanim zostanie zainicjowana.

Ale jeśli to zrobię

if(condition) 
    const x = 5; 

else 
    const x = 10; 

X staje blok scoped.

Jak warunkowo utworzyć stałą?

Odpowiedz

11

Twój problem, jak wiadomo, jest to, że const musi być intialised w to samo oświadczenie, że zostało ono zadeklarowane.

Nie oznacza to, że wartość przypisana do stałej musi być wartością dosłowną. Może to być dowolne ważne stwierdzenie: - T2:

const x = IsSomeValueTrue() ? 1 : 2; 

A może po prostu przypisać je do wartości zmiennej?

let y = 1; 
if(IsSomeValueTrue()) { 
    y = 2; 
} 

const x = y; 

Można oczywiście przypisać ją do wartości zwracanej przez funkcję, za:

function getConstantValue() { 
    return 3; 
} 

const x = getConstantValue(); 

więc istnieje wiele sposobów, aby wartość dynamiczną, po prostu trzeba upewnić się, że przypisany tylko w jednym miejscu.

+0

Sposób działania jest czystszy, jeśli mamy długie warunki i obliczenia (jak w moim przypadku), które wyglądałyby niechlujnie przy użyciu operatora trójskładnikowego. –

+0

Zgadzam się, że metoda funkcji jest prawdopodobnie najczystsza, szczególnie w bardziej skomplikowanych warunkach. Po prostu wybierz dowolną metodę najlepiej pasującą do twojego przypadku użycia :) – Hecksa

+0

Preferuję ostatnią opcję (funkcję), ponieważ pozwala ona zmienić, ponownie wykorzystać lub nawet przetestować logikę bez zależności od reszty klasy. – ssube

3

Zakładając, że const zostanie ogłoszony w obu przypadkach można użyć potrójny Zadanie:

const x = condition ? 5 : 10; 
+0

myślę, że są one nauczane trójskładnikowych ':' jest złem, nie czytelny styl. To pokonuje 'repeat yourself'principle, że tak zwana" czytelność "jest oparta na :) –

+0

Jeśli deklaruję wiele stałych, musiałbym powtórzyć warunek dla każdego z nich. 'x = cond? a: b; y = cond? e: f' –

+2

@ArjunU. Przeczytaj "const [a, b] = [x, y]' zadanie. –

4

Jeśli operator trójargumentowy nie jest opcją dla jego nieczytelność, jedynym Inną opcją jest Iife, co jest uciążliwe, ale można czytać płynnie:

const x = (() => { 
    if (condition) 
    return 5 
    else 
    return 10 
})(); 

Semantyka const jest to, że jest przypisany tylko raz. Powinno być let dla tego przypadku użycia:

let x; 
if(condition) x = 5; 
else x = 10; 

Z mojego osobistego doświadczenia, ~ 95% zmiennych są const. Jeśli zmienna musi być let, po prostu niech to będzie sama; prawdopodobieństwo błędów spowodowanych przypadkowymi zmianami jest znikome.

+0

IIFE wydaje się najmodniejszym rozwiązaniem, biorąc pod uwagę przypadek użycia zdefiniowany w komentarzach OP – CodingIntrigue

+1

Jeśli trójskładnik jest nieczytelny, jak na Ziemi jest IIFE * lepszy *? To znacznie mniej czytelne. – ssube

+0

@ssube IIFE to ustalone konstrukcje językowe, które mogą być automatycznie interpretowane przez płynne głośniki JS, strzałki sprawiają, że są one cieńsze, pomagają również odpowiednie wcięcia i nawiasy. Jest to subiektywne, ale należy zauważyć, że w odpowiedzi nie ma słowa "lepiej", a słowo "ziemia" nie czyni argumentu bardziej uzasadnionym. Fakt, że IIFE nie działają dla ciebie, nie oznacza, że ​​nie działają one dla wszystkich, dzięki za komentarz i tak dalej. – estus

0

I sugerują, że to rozwiązanie z realizacji Singleton Pattern:

var Singleton = (function() { 
    var instance; 

    function createInstance() { 
     // all your logic here 
     // so based on your example: 
     // if(condition) return 5; 
     // else return 10; 
    } 

    return { 
     getInstance: function() { 
      if (!instance) { 
       instance = createInstance(); 
      } 
      return instance; 
     } 
    }; 
})(); 

const x = Singleton.getInstance();