Javacript używa oceny zwarcia dla operatorów logicznych ||
i &&
. Jednak różni się od innych języków tym, że zwraca wynik ostatniej wartości, która zatrzymała wykonanie, zamiast wartości a true
lub false
.
Poniższe wartości są uważane za falsy w JavaScript.
- fałszywe
- zero
""
(pusta struna)
- 0
- Nan
- nieokreślony
Ignorując reguły pierwszeństwa operatora i upraszczając, poniższe przykłady pokazują, która wartość zatrzymała ocenę i w rezultacie została zwrócona.
false || null || "" || 0 || NaN || "Hello" || undefined // "Hello"
Pierwsze 5 wartości w NaN
górę to fałsz, więc wszystkie są oceniane od lewej do prawej, dopóki nie osiągnie pierwszej wartości zgodnej z prawdą - "Hello"
co sprawia, że całe wyrażenie jest prawdziwe, więc żadne dalsze wyrażenie nie będzie oceniane i "Hello"
zostanie zwrócone w wyniku wyrażenia . Podobnie w tym przypadku:
1 && [] && {} && true && "World" && null && 2010 // null
Wszystkie 5 pierwszych wartości są zgodne z prawdą i są poddawane ocenie, dopóki nie spełnią pierwszej wartości fałszowania ( null
), co powoduje, że wyrażenie jest fałszywe, więc 2010
nie jest już oceniane, i null
zostaje zwrócone w wyniku wyrażenia.
Podany przykład wykorzystuje tę właściwość JavaScript do wykonania zadania. Można go używać wszędzie tam, gdzie trzeba uzyskać pierwszą wartość prawdy lub fałszu spośród zestawu wartości. Poniższy kod przypisze wartość "Hello"
do, b
ponieważ ułatwia przypisanie wartości domyślnej, zamiast przeprowadzania kontroli if-else.
var a = false;
var b = a || "Hello";
Poniższy przykład można nazwać wykorzystaniem tej funkcji i uważam, że utrudnia to odczytanie kodu.
var messages = 0;
var newMessagesText = "You have " + messages + " messages.";
var noNewMessagesText = "Sorry, you have no new messages.";
alert((messages && newMessagesText) || noNewMessagesText);
Wewnątrz alertu sprawdzamy, czy messages
jest to fałsz, a jeśli tak, to oceniamy i wracamy noNewMessagesText
, w przeciwnym razie oceniamy i wracamy newMessagesText
. Ponieważ w tym przykładzie jest to fałsz, zatrzymujemy się na noNewMessagesText i ostrzegamy "Sorry, you have no new messages."
.
$f=$a or $f=$b or $f=$c; // etc
. PHP ma zarówno||
operatora, jak ior
operatora, którzy wykonują tę samą pracę; jednakor
jest oceniany po przypisaniu, podczas gdy||
jest oceniany wcześniej. To również daje perlish styl$a=getSomething() or die('oops');