Biorąc pod uwagę ten fragment kodu JavaScript ...
var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';
var f = a || b || c || d || e;
alert(f); // 4
Czy ktoś może mi wyjaśnić, jak nazywa się ta technika (najlepiej zgaduję w tytule tego pytania!)? I jak / dlaczego to działa dokładnie?
Rozumiem, że zmiennej f
zostanie przypisana najbliższa wartość (od lewej do prawej) pierwszej zmiennej, która ma wartość, która nie jest ani zerowa, ani niezdefiniowana, ale nie udało mi się znaleźć wielu materiałów referencyjnych na temat tej techniki i mieć widziałem, że dużo zużyło.
Czy ta technika jest specyficzna dla JavaScript? Wiem, że zrobienie czegoś podobnego w PHP spowoduje f
prawdziwą wartość boolowską, a nie wartość d
samego siebie.
$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');
$f = $a ?: $b ?: $c;
??
do tego użyć .$a = $b ?? 'default'
$a
zostanie przypisana wartość$b
, jeśli$b
jest prawdą, inne'default'
?Odpowiedzi:
Zobacz ocenę zwarciem za wyjaśnienie. Jest to powszechny sposób wdrażania tych operatorów; nie jest unikalny dla JavaScript.
źródło
if( true == f )
. Jeśli w f została zapisana liczba całkowita, to test zawsze zwróci false.if(true == f)
, co jest takie samo jakif(f)
: test przejdzie. Jeśli chcesz również przetestować typ zf
użyj ścisłego porównania:if(true === f)
, który zakończy się niepowodzeniem rzeczywiście.Służy to do przypisania wartości domyślnej , w tym przypadku wartości
y
, jeślix
zmienna jest fałszem .Operatory boolowskie w JavaScript mogą zwracać operand i nie zawsze wynik boolowski, jak w innych językach.
Operator logiczny OR (
||
) zwraca wartość drugiego operandu, jeśli pierwszy jest fałszem, w przeciwnym razie zwracana jest wartość pierwszego operandu.Na przykład:
Wartości fałszowania to te, które zmuszają się,
false
gdy są używane w kontekście logicznym, i są nimi0
,null
,undefined
, pusty ciąg,NaN
i oczywiściefalse
.źródło
||
wyłączny.&&
Operator logiczny ma podobne zachowanie, zwraca wartość pierwszego operandu, jeśli sam w sobie jest fałszem, i zwraca wartość drugiego operandu, tylko jeśli pierwszy jest prawdziwy , np.("foo" && "bar") == "bar"
I(0 && "bar") == 0
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 atrue
lubfalse
.Poniższe wartości są uważane za falsy w JavaScript.
""
(pusta struna)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.
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: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ęc2010
nie jest już oceniane, inull
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.Poniższy przykład można nazwać wykorzystaniem tej funkcji i uważam, że utrudnia to odczytanie kodu.
Wewnątrz alertu sprawdzamy, czy
messages
jest to fałsz, a jeśli tak, to oceniamy i wracamynoNewMessagesText
, w przeciwnym razie oceniamy i wracamynewMessagesText
. Ponieważ w tym przykładzie jest to fałsz, zatrzymujemy się na noNewMessagesText i ostrzegamy"Sorry, you have no new messages."
.źródło
However, it's different to other languages in that it returns the result of the last value that halted the execution, instead of a true, or false value.
Zmienne JavaScript nie są wpisywane, więc f można przypisać wartość całkowitą, nawet jeśli została ona przypisana za pomocą operatorów logicznych.
f jest przypisywana najbliższa wartość, która nie jest równoważna wartości false . Tak więc wszystkie 0, false, null, undefined, są pomijane:
źródło
''
również równe fałsz w tym przypadku.f is assigned the NEAREST value
co jest dość ważnym punktem tutaj.||
Operator boolowski , będąc operatorem boolowskim, ma dwa operandy: lewą i prawą stronę. Jeśli lewa strona||
jest prawdą , operacja jest rozpatrywana na lewą, a prawa strona jest ignorowana. Jeśli lewa strona jest fałszem , rozwiązuje się na prawej stronie. Tak więcnull || undefined || 4 || 0
faktycznie rozwiązuje, doundefined || 4 || 0
którego decyduje, do4 || 0
którego decyduje4
.Nie ma w tym żadnej magii. Wyrażenia logiczne, takie jak,
a || b || c || d
są leniwie oceniane. Interpeter szuka wartościa
, jest niezdefiniowany, więc jest fałszywy, więc porusza się dalej, a następnie widzi,b
która wartość jest pusta, co nadal daje fałszywy wynik, więc porusza się dalej, a następnie widzic
- tę samą historię. Wreszcie widzid
i mówi „huh, to nie jest zero, więc mam swój wynik” i przypisuje go do zmiennej końcowej.Ta sztuczka będzie działać we wszystkich dynamicznych językach, które wykonują leniwe zwarcie w wyrażeniach boolowskich. W językach statycznych nie będzie się kompilować (błąd typu). W językach, które chętnie oceniają wyrażenia logiczne, zwróci wartość logiczną (w tym przypadku true).
źródło
d
zostanie przypisany, niezależnie od tego, czy był nieważny / niezdefiniowany, czy nie.||
operator zawsze rozpoznaje operand po całej prawej stronie, gdy lewa strona jest fałszywa. Będąc operatorem typu boolean, widzi tylko dwa wejścia: lewą i prawą stronę. Analizator składniowy nie widzi ich jako szeregu terminów, więc tak naprawdę nie zatrzymuje się, gdy znajdzie pierwszą prawdziwą wartość, chyba że ta wartość jest również operandem lewej ręki innego||
.To pytanie otrzymało już kilka dobrych odpowiedzi.
Podsumowując, ta technika wykorzystuje funkcję kompilacji języka. Oznacza to, że JavaScript „zwiera” ocenę operatorów boolowskich i zwróci wartość związaną z pierwszą niefałszową wartością zmiennej lub jakąkolwiek ostatnią zmienną. Zobacz wyjaśnienie Anuragu dotyczące wartości, które zostaną ocenione jako fałszywe.
Korzystanie z tej techniki nie jest dobrą praktyką z kilku powodów; jednak.
Udokumentowane funkcje: Istnieje istniejąca alternatywa, która spełnia tę potrzebę i jest spójna w większej liczbie języków. Byłby to operator trójskładnikowy:
()? wartość 1: wartość 2.
Użycie operatora trójskładnikowego wymaga nieco więcej pisania, ale wyraźnie rozróżnia między wyrażeniem logicznym, które jest oceniane, a przypisywaną wartością. Ponadto można go łączyć w łańcuchy, aby można było odtworzyć typy domyślnych przypisań wykonywane powyżej.
źródło
potentially be targeted for change in the future.
tak, ale nie dotyczy to javascript.a || b || c || d || e
?Zwraca wyjściową pierwszą prawdziwą wartość .
Jeśli wszystkie są fałszywe, zwróć ostatnią fałszywą wartość.
Przykład:-
źródło
Ustawia nową zmienną (
z
) na wartośćx
„prawda” (niezerowa, poprawny obiekt / tablica / funkcja / cokolwiek to jest) luby
inaczej. Jest to stosunkowo powszechny sposób podawania wartości domyślnej w przypadku,x
gdy nie istnieje.Na przykład, jeśli masz funkcję, która pobiera opcjonalny parametr wywołania zwrotnego, możesz podać domyślne wywołanie zwrotne, które nic nie robi:
źródło
Oznacza to, że jeśli
x
jest ustawiony, wartość dlaz
będziex
, w przeciwnym razie, jeśliy
zostanie ustawiony, wówczas jego wartość zostanie ustawiona jakoz
wartość.to to samo co
Jest to możliwe, ponieważ operatory logiczne w JavaScript nie zwracają wartości boolowskich, ale wartość ostatniego elementu potrzebnego do zakończenia operacji (w zdaniu OR byłaby to pierwsza nie-fałszywa wartość, w zdaniu AND byłaby to ostatnia ). Jeśli operacja się nie powiedzie,
false
zostanie zwrócona.źródło
||
operator zwraca drugą wartość, niezależnie od tego, czy jest zgodna z prawdą, czy nie.z
ustawić wartość,x
jeśli ta wartość jest prawdziwa . W przeciwnym razie zostanie ustawiona wartośćy
. Oznacza to, że jeślix
ustawiono na przykład0
pusty ciąg""
, nie robi to, co mówisz, ponieważ te wartości są fałszywe .Nazywa się to operatorem zwarcia.
Ocena zwarcia mówi, że drugi argument jest wykonywany lub oceniany tylko wtedy, gdy pierwszy argument nie jest wystarczający do ustalenia wartości wyrażenia. gdy pierwszy argument funkcji OR (||) ma wartość true, całkowita wartość musi być prawdziwa.
Może być również użyty do ustawienia domyślnej wartości argumentu funkcji.`
źródło
Ocenia X, a jeśli X nie ma wartości NULL, pusty łańcuch lub 0 (logiczny fałsz), wówczas przypisuje go do z. Jeśli X ma wartość NULL, pusty ciąg lub 0 (logiczny fałsz), wówczas przypisuje y do z.
Wyjdzie „bob”;
źródło
false
, ale puste tablice lub obiekty zmuszajątrue
.Zgodnie z postem na blogu Billa Higginsa ; idiom logiczny OR przypisania JavaScript (luty 2007), to zachowanie jest prawdziwe od wersji 1.2 (przynajmniej)
Sugeruje także inne zastosowanie (cytowane): „ lekka normalizacja różnic między przeglądarkami ”
źródło