74

Mam zmiennej, która może być boolean false lub liczbę całkowitą (w tym 0). Chcę, aby umieścić go w instrukcji switch jak:Czy można bezpiecznie porównać w instrukcji przełączania JavaScript?

switch(my_var){ 
    case 0: 
     // Do something 
     break; 
    case 1: 
     // Do something else 
     break; 
    case false: 
     // Some other code 
} 

w moich testów w Google Chrome, wydaje się doskonale działa, ale jestem trochę nerwowy go używać, ponieważ obawiam się, że w niektórych przeglądarkach , jeśli my_var jest false, może wykonać pierwszy przypadek od 0 == false.

Zastanawiam się tylko, czy w języku JavaScript jest coś oficjalnego, co oznacza, że ​​instrukcja switch używa ścisłego porównania takiego, że 0 !== false, ale ja sam nie mogę znaleźć i nie jestem pewien, czy to zadziała dobrze w różne silniki JavaScript. Czy ktokolwiek wie, czy porównanie wykonane przez instrukcję switcha ma być surowe?

Odpowiedz

71

Spójrz na ECMA 262, section 12.11, drugi algorytm, 4.c.

c. Jeżeli wejście jest równa clauseSelector zdefiniowany przez operatora ===, to ...

+5

Od 1999 roku [imprezuje się tak] (http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition, % 20December% 201999.pdf) (strona 68, s. 12.11, CaseBlock # 3) – Walf

25

http://qfox.nl/notes/110 odpowiada na pytanie. (Ten facet dużo wie o poprawności JavaScript)

Przełączniki w JavaScript stosują ścisłe sprawdzanie typu (===). Więc nigdy nie musisz się martwić o przymus, który zapobiega kilku wtfjs :). Jeśli z drugiej strony liczyłeś na przymus, to ciężko, bo nie możesz tego zmusić.

+0

https://jsfiddle.net/to469fLm/4/, można uogólnij funkcję wymuszania, aby spełnić Twoje potrzeby. – darethas

33

Spróbuj:

switch(1) { 
    case '1': 
    alert('Switch comparison is NOT strict.'); 
    break; 
    case 1: 
    alert('Switch comparison is strict.'); 
    break; 
    default: 
    alert('Huh?'); 
} 
+6

Westchnienie, nigdy nie przyzwyczaję się do downvotes. –

+15

Okay, powód, dla którego otrzymuję downvotes, polega na tym, że aby odpowiedzieć na to pytanie, musisz wypróbować to na każdym silniku JavaScript, który mógłby uruchomić twoją aplikację lub bibliotekę JavaScript, co może być bardzo dużo. Jednak jestem wielkim fanem testowania nawet podstawowej funkcjonalności. Niezależnie od tego, jak autorytatywny jest dokument, nie może zagwarantować, że wszystkie najważniejsze implementacje są zgodne, a najpewniejszym sposobem sprawdzenia jest przetestowanie. –

+1

Podniosłem drugi komentarz, ponieważ masz rację - testowanie jest ważne. Jako programista wezmę odpowiedzialność za kod do pracy na pewnym zestawie przeglądarek - te, które znam, zostały przetestowane. OTOH, jeśli nie możemy polegać na autorytatywnej dokumentacji, jaki jest sens stackoverflow.com? (I choć nie daje ci to kredytu, miejmy nadzieję, że jeszcze jeden upominek sprawi, że będziesz miał dzień). (W każdym razie i tak masz już większe zaufanie ode mnie.) –

Powiązane problemy