var x = v || 10;
To operator (the "logical" or "short-circuit" OR operator) normalnie sprawdzić wartość v
, a jeśli jest to "falsy" wartość (tj. zawodzi jako warunek używany w instrukcji if), 10
staje się wartością x
, w przeciwnym razie v
ma (i jeśli 10
były funkcją, to nigdy by nie zostały wykonane).
undefined
, null
i 0
wszystko to są przykłady wartości falsy że zmienna może mieć (tak, nawet pierwszy), a operator (lub oświadczenie) działa odpowiednio. W przeciwieństwie do tego, wszystkie obiekty i tablice (nie wliczając null) są „truthy” wartości, co pozwala na takie rzeczy jak to (stosowany w tracker kod Google Analytics):
var _gaq = _gaq || []; // Makes a new array _gaq if it is not already there
Jednakże, jeżeli zmienna odwołuje się nawet nie zostało zadeklarowane gdziekolwiek w łańcuchu zasięgu, wystąpi wyjątek JavaScript.
Jednym ze sposobów na uniknięcie tego jest deklarując wszystkie zmienne globalne od początku:
var iAmAGlobalVariable; // Holds the value undefined by default
Jeśli nie jest to możliwe, należy użyć typeof
operator. To nie próba oceny jego argument, a zatem wyjątek nie wystąpią:
var x;
if(typeof v != 'undefined' && v) {
x = v;
} else {
x = 10;
}
Albo jeszcze lepiej, jeśli wiesz, że zmienna będzie zmienną globalną, można traktować go jako własność globalny (window) object:
var x = window.v || 10;
Działa świetnie! Robię to codziennie. – Hemlock
W jakim sensie masz na myśli, że to nie działa? Czy możesz rozwinąć? Żadne z twoich rozwiązań nie działa, gdy v = 0 to inny fakt. – lazyboy
jeśli konkretnie pracujesz z liczbami całkowitymi, powinieneś użyć 'var x = v> 0? v: 10' – RobertPitt