2012-03-25 29 views
35

Zastanawiam się, czy istnieje krótsza droga to napisać:Shorthand if/else JavaScript

var x = 1; 
if(y != undefined) x = y; 

początkowo próbował x = y || 1, ale to nie działa. Jaki jest właściwy sposób, aby to osiągnąć?

+0

'x = y || x' działa, jeśli nie dba o nieokreślonej ścisłym ** ** – Nemesarial

Odpowiedz

73
var x = y !== undefined ? y : 1; 

Zauważ, że var x = y || 1; byłoby przypisać 1 dla każdego przypadku y jest falsy (np false, 0, ""), które mogą być, dlaczego „nie działa” dla Ciebie. Ponadto, jeśli y jest zmienną globalną, jeśli naprawdę nie jest zdefiniowana, może wystąpić błąd, chyba że uzyskasz dostęp do niego jako window.y.


Jak vol7ron sugeruje w komentarzach, można również użyć typeof aby uniknąć potrzeby odwoływania się do globalnych Vars jak window.<name>:

var x = typeof y != "undefined" ? y : 1; 
+0

Yay dla operatorów trójskładnikowych. Wypróbuję to. Edycja: Ah, okej. A co z "niezdefiniowanym"? Nie wydawało się, żeby to złapało. –

+0

Co masz na myśli? Ciąg 'undefined'' jest wartością rzeczywistą i nie jest równy rzeczywistej wartości' undefined'. – Amber

+0

Miałem na myśli, gdy zmienna nie została w ogóle zadeklarowana. Wiem, że ciąg "niezdefiniowany" jest wartością logiczną prawda, ale tego nie szukałem. –

3
y = (y != undefined) ? y : x; 

Nawiasy nie są konieczne, po prostu dodaj ponieważ uważam, że łatwiej jest je czytać w ten sposób.

+3

Twoje pareny są niezrównoważone (a także niepotrzebne). – Amber

+0

@Amber W momencie, w którym zaczynasz używać skrótu javscript, już mówisz, że nie zależy Ci na czytelności, więc po co zawracać sobie głowę zrównoważonymi parensami ?. –

13

Innym sposobem napisać go krótko

bePlanVar = !!((bePlanVar == false)); 

// is equivalent to 

bePlanVar = (bePlanVar == false) ? true : false; 

// and 

if (bePlanVar == false) { 
    bePlanVar = true; 
} else { 
    bePlanVar = false; 
} 
1

inny sposób niż trójskładnikowych użyciu zwarciowe:

typeof y !== 'undefined' && y || 1

Chociaż nadal uważam trójargumentowy bardziej czytelne ...

0

Oto sposób na to, który działa, ale może nie być najlepszą praktyką dla jakiegokolwiek języka:

var x,y; 
x='something'; 
y=1; 
undefined === y || (x = y); 

alternatywnie

undefined !== y && (x = y); 
+0

Po prostu zauważyłem, że został już dostarczony przez @AndreFigueiredo – Nemesarial

Powiązane problemy