2013-09-30 9 views
88

Uwielbiam mechanizm Ruby o numerze ||=. Jeśli zmienna nie istnieje lub jest nil, a następnie utworzyć i ustawić go równa coś:Ruby's || = (lub equals) w JavaScript?

amount # is nil 
amount ||= 0 # is 0 
amount ||= 5 # is 0 

muszę zrobić coś podobnego w JavaScripcie teraz. Jaka jest konwencja lub właściwy sposób na zrobienie tego? Wiem, że ||= nie jest prawidłową składnią. 2 oczywistych sposobów, aby obsłużyć to:

window.myLib = window.myLib || {}; 

// or 

if (!window.myLib) 
    window.myLib = {}; 

Odpowiedz

105

Obie są absolutnie poprawne, ale jeśli szukasz czegoś, co działa jak ||= w Ruby. Pierwsza metoda, która jest variable = variable || {} jest jednym szukasz :)

14

Można użyć operatora logicznego OR || który ocenia jego prawy operand jeśli lVal jest wartością falsy.

wartości Falsy obejmują np null,false,0,"",undefined,NaN

var x = x || 1;

-2

Ruby's || = cesja obwodów operatora. To może być traktowane tak:

return a || a = b 

Więc w javascript, to wygląda bardzo podobnie:

return a || (a = b); 

Wydaje się, zauważył w komentarzach poniżej jednak, że ta dosłowna forma Ruby jest mniej wydajny niż standardowy idiom javascript a = a || b.

Dla porównania: http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html

+0

W praktyce wydaje się, że 'a = a || Forma b jest bardziej optymalna http://jsperf.com/x-or-x-equals-0-vs-x-equals-x-or-0/3 – jchook

+0

ah fajne narzędzie. jak to wygląda, jeśli x ma wartość i tak krótkie obwody? – chris

+0

Uważam, że rozłączenie musi być jawne na jsperf, więc [ten test] (http://jsperf.com/x-or-x-equals-0-vs-x-equals-x-or-0/4) powinien pokazać wydajność zwarcia. Domyślam się, że V8 ma specjalną optymalizację dla postaci 'a = a || b'. – jchook

4

Jeśli pracujesz z obiektami, można wykorzystać rozpad (ponieważ ES6) tak:

({ myLib: window.myLib = {} } = window); 

... ale nic nie zyskać nad zaakceptowana odpowiedź, z wyjątkiem zamieszania.