2011-01-02 14 views
24

Ostatnio czytałem jeden artykuł, który przeczytałem, z Opery.JavaScript || lub operator z niezdefiniowaną zmienną

http://dev.opera.com/articles/view/javascript-best-practices/

W tym artykule piszą tak:

Inną częstą sytuacją w JavaScript dostarcza zaprogramowaną wartość dla zmiennej jeśli nie jest zdefiniowane, jak tak:

if(v){ 
    var x = v; 
} else { 
    var x = 10; 
} 

Zapis skrótu jest to znak podwójna rura:

var x = v || 10; 

Z jakiegoś powodu nie mogę uzyskać to do pracy dla mnie. Czy naprawdę jest możliwe sprawdzenie, czy zdefiniowano v, jeśli nie x = 10?

- Dzięki. Bryan

+0

Działa świetnie! Robię to codziennie. – Hemlock

+0

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

+0

jeśli konkretnie pracujesz z liczbami całkowitymi, powinieneś użyć 'var x = v> 0? v: 10' – RobertPitt

Odpowiedz

47

Artykuł w Operze daje zły opis tego, co się dzieje.

Chociaż prawdą jest, że x otrzyma wartość 10, jeśli v jest undefined. Prawdą jest również, że x będzie mieć wartość , jeśli "" ma wartość "falsey".

Wartości "falsey" w JavaScript są:

  • 0
  • null
  • undefined
  • NaN
  • "" (pusty ciąg znaków)
  • false

Widać więc, że istnieje wiele przypadków, w których x zostanie ustawione na 10 oprócz tylko undefined.

Here's some documentation wyszczególnienie operatorów logicznych. (Ten jest "logicznym OR".) Podaje kilka przykładów użycia tego przydziału.

Krótki przykład: http://jsfiddle.net/V76W6/

var v = 0; 

var x = v || 10; 

alert(x); // alerts 10 

Przypisywanie v którejkolwiek z dopuszczalnych falsey że wskazane powyżej, a dostaniesz ten sam rezultat.

+0

Dzięki za tę odpowiedź, więc uważasz, że najlepiej byłoby zrobić: var v = false; var x = v || 10; alert (x)? –

+2

Innym sposobem opisania, co zostało wykonane, jest: http://jsfiddle.net/robertpitt/V76W6/1/ – RobertPitt

+0

@ bryan: Nie ma potrzeby przypisywania 'false' do' v'. Jeśli po prostu zrobisz 'var v;', automatycznie uzyska on wartość początkową 'undefined', więc jeśli' v' uzyska inną wartość inną niż falsey, to 'x' zostanie przypisana do tej wartości. Ale jeśli 'v' nie zostanie przypisany do niczego lub otrzyma inną wartość falsey,' x' otrzyma '10'. Pamiętaj, że '0' to falsey. Powinieneś używać tego "logicznego OR" w ten sposób, jeśli masz całkowitą pewność, że nie chcesz, aby 'x' miał * dowolną * wartość falsey. – user113716

1

chciałbym po prostu użyć try-catch

var x = 0; 

try 
{ 
    x = v; 
} 
catch(err) 
{ 
    x = 10; 
} 
5

Jeśli v wartość false (np 0, null, false), to nie będzie działać. Możesz ręcznie sprawdzić niezdefiniowane:

var x = v !== undefined ? v : 10; 
+0

możesz również ręcznie sprawdzić 0, zero, fałsz, "", NaN:/ – RobertPitt

0

Oto jak dostać pracy:

var v;   //declare v as undefined 
// v = 5;  //if uncommented x will be 5 

var x = v || 10; 
alert(x);  //output: 10 

http://jsfiddle.net/uLLtu/1/

+1

rzeczy gotowe na dokumenty nie są konieczne btw. –

+1

Tylko na użytek kilku osób, które nadal nie widzą "javascript" i myślą "jquery", '$ (function() {...});' jest tym, co Eric nazywa "dokumentem gotowym" ; jest to skrót jQuery dla '$ (document) .ready (function() {...});', który jest (ogólnie) wywoływany, gdy DOM jest już załadowany (ale przed zdarzeniem 'load' w' oknie'). Nie jestem pewien, dlaczego jest on uwzględniony w tej odpowiedzi w pierwszej kolejności. – eyelidlessness

+0

@eyelidlessness Dzięki za wyjaśnienia, masz rację, nie ma potrzeby, po prostu zapomniałem je usunąć, najpierw używam znaczników do zilustrowania zawartości var zamiast alertu. –

8
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; 
+0

Dobrze wyjaśniona odpowiedź. –

Powiązane problemy