Debuguję JavaScript i nie mogę wyjaśnić, co to ||
robi?
function (title, msg) {
var title = title || 'Error';
var msg = msg || 'Error on Request';
}
Czy ktoś może mi podpowiedzieć, dlaczego ten facet używa var title = title || 'ERROR'
? Czasami też widzę to bez var
deklaracji.
javascript
parameters
optional-parameters
or-operator
opHASnoNAME
źródło
źródło
falsy
NIE, TYLKOundefined
. Liczba razy, które widziałamdoWeDoIt = doWeDoIt || true
, wystarcza, by płakać. (tj.doWeDoIt
teraz już nigdy nie będziefalse
)??
. JavaScript ocenia niepuste obiekty, takie jaktrue
(lub lepiej evalualtes zerowe obiekty na false)Odpowiedzi:
Oznacza to, że
title
argument jest opcjonalny. Więc jeśli wywołasz metodę bez argumentów, użyje ona domyślnej wartości"Error"
.To jest skrót do pisania:
Ten rodzaj skróconej sztuczki z wyrażeniami logicznymi jest również powszechny w Perlu. Z wyrażeniem:
ocenia
true
,a
czyb
jest albo jesttrue
. Więc jeślia
to prawda, nie musisz wcale sprawdzaćb
. Jest to tak zwana ocena logiczna zwarcia, więc:w zasadzie sprawdza, czy
title
oceniafalse
. Jeśli tak, „wraca”"Error"
, w przeciwnym razie zwracatitle
.źródło
Co to jest operator podwójnej rury (
||
)?Operator podwójnej rury (
||
) jest operatorem logicznymOR
. W większości języków działa to w następujący sposób:false
, sprawdza drugą wartość. Jeśli taktrue
, to wraca,true
a jeśli takfalse
, to wracafalse
.true
, zawsze zwracatrue
, bez względu na drugą wartość.Zasadniczo działa to tak:
Jeśli nadal nie rozumiesz, spójrz na tę tabelę:
Innymi słowy, jest to fałsz tylko wtedy, gdy obie wartości są fałszywe.
Czym różni się JavaScript?
JavaScript jest nieco inny, ponieważ jest to luźno napisany język . W takim przypadku oznacza to, że można użyć
||
operatora z wartościami, które nie są wartościami logicznymi. Chociaż nie ma to sensu, możesz użyć tego operatora na przykład z funkcją i obiektem:Co tu się dzieje?
Jeśli wartości nie są wartościami logicznymi, JavaScript dokonuje domyślnej konwersji na wartość logiczną . Oznacza to, że jeśli wartość jest falsey (np
0
,""
,null
,undefined
(patrz również wszystkie wartości falsey w JavaScript )), będzie ona traktowana jakofalse
; w przeciwnym razie jest traktowane jakotrue
.Powyższy przykład powinien dać
true
, ponieważ pusta funkcja jest prawdziwa. Tak nie jest. Zwraca pustą funkcję. Jest tak, ponieważ||
operator JavaScript nie działa tak, jak napisałem na początku. Działa w następujący sposób:Zaskoczony? W rzeczywistości jest „kompatybilny” z tradycyjnym
||
operatorem. Można go zapisać jako następującą funkcję:Jeśli przekażesz prawdziwą wartość jako
x
, zwraca onax
, to znaczy prawdziwą wartość. Więc jeśli użyjesz go później wif
klauzuli:dostajesz
"Either x or y is truthy."
.Gdyby to
x
był falsey,eitherXorY
byłobyy
. W takim przypadku zrozumiałbyś, że"Either x or y is truthy."
jeśliy
to prawda; inaczej byś dostał"Neither x nor y is truthy"
.Rzeczywiste pytanie
Teraz, gdy wiesz, jak
||
działa operator, prawdopodobnie sam możesz zrozumieć, co tox = x || y
znaczy. Jeślix
jest prawdą,x
jest przypisanex
, więc tak naprawdę nic się nie dzieje; w przeciwnym raziey
jest przypisany dox
. Jest powszechnie używany do definiowania domyślnych parametrów funkcji. Często jest to jednak uważane za złą praktykę programistyczną , ponieważ zapobiega przekazywaniu wartości falsey (niekoniecznieundefined
lubnull
) jako parametru. Rozważ następujący przykład:Wygląda na ważne od pierwszego wejrzenia. Co by się jednak stało, gdybyś podał
false
jakoflagA
parametr (ponieważ jest to wartość logiczna, tzn. Może byćtrue
lubfalse
)? To się stanietrue
. W tym przykładzie nie ma możliwości ustawieniaflagA
nafalse
.Byłoby to lepszy pomysł, aby jednoznacznie sprawdzić, czy
flagA
toundefined
, tak:Chociaż jest dłuższy, zawsze działa i jest łatwiejszy do zrozumienia.
Możesz także użyć składni ES6 dla domyślnych parametrów funkcji , ale pamiętaj, że nie działa ona w starszych przeglądarkach (takich jak IE). Jeśli chcesz obsługiwać te przeglądarki, powiel swój kod za pomocą Babel .
Zobacz także Operatory logiczne w MDN .
źródło
title = title || 'Error'
oznaczaif (title) { title = title; } else { title = 'Error'; }
title ||= 'Error'
.Jeśli tytuł nie jest ustawiony, użyj „BŁĄD” jako wartości domyślnej.
Bardziej ogólny:
Odczytuje: Ustaw foobar na
foo
lubdefault
. Możesz nawet połączyć to wiele razy:źródło
Wyjaśniając to trochę więcej ...
||
Operatora jest logical-or
operatora. Wynik jest prawdziwy, jeśli pierwsza część jest prawdziwa i jest prawdą, jeśli druga część jest prawdziwa i jest prawdą, jeśli obie części są prawdziwe. Dla jasności, oto tabela:Czy zauważysz coś tutaj? Jeśli
X
jest prawdą, wynik jest zawsze prawdziwy. Więc jeśli wiemy, żeX
to prawda, nie musimy wcale sprawdzaćY
. Wiele języków implementuje zatem ewaluatory „zwarć” dla logicznychor
(i logicznych -and
pochodzących z innego kierunku). Sprawdzają pierwszy element, a jeśli to prawda, wcale nie zawracają sobie głowy sprawdzaniem drugiego. Wynik (logicznie) jest taki sam, ale pod względem wykonania istnieje potencjalnie ogromna różnica, jeśli drugi element jest drogi do obliczenia.Co to ma wspólnego z twoim przykładem?
Spójrzmy na to.
title
Elementem jest przekazywana do funkcji. W JavaScript, jeśli nie podasz parametru, domyślnie przyjmuje wartość zerową. Również w JavaScript, jeśli twoja zmienna ma wartość zerową, operatory logiczne uznają ją za fałsz. Więc jeśli funkcja jest wywoływana z podanym tytułem, jest to wartość niefałszowa, a zatem przypisana do zmiennej lokalnej. Jeśli jednak nie zostanie podana wartość, jest to wartość zerowa, a zatem fałsz.or
Operator logiczny ocenia następnie drugie wyrażenie i zwraca zamiast tego „Błąd”. Zatem teraz zmienna lokalna otrzymuje wartość „Błąd”.Działa to z powodu implementacji wyrażeń logicznych w JavaScript. Nie zwraca właściwej wartości logicznej (
true
lubfalse
), ale zwraca wartość podaną zgodnie z niektórymi regułami co do tego, co jest uważane za równoważne,true
a co za równoważnefalse
. Sprawdź swoją referencję JavaScript, aby dowiedzieć się, co JavaScript uważa za prawdę lub fałsz w kontekście logicznym.źródło
Podwójna rura oznacza logiczne „LUB”. Tak naprawdę nie dzieje się tak, gdy „parametr nie jest ustawiony”, ponieważ ściśle w javascript, jeśli masz taki kod:
Potem dzwoni
nie są równoważne.
Podwójna rura (||) wyrzuci pierwszy argument na wartość logiczną, a jeśli wynikowa wartość logiczna jest prawdziwa - wykonaj przypisanie, w przeciwnym razie przypisze odpowiednią część.
Ma to znaczenie, jeśli zaznaczysz parametr nieustawiony.
Powiedzmy, że mamy funkcję setSalary, która ma jeden opcjonalny parametr. Jeśli użytkownik nie poda parametru, należy użyć wartości domyślnej 10.
jeśli wykonasz taką kontrolę:
Daje to nieoczekiwany wynik podczas połączenia
Nadal ustawi 10 zgodnie z opisanym powyżej przepływem.
źródło
Zasadniczo sprawdza, czy wartość przed || przyjmuje wartość true, jeśli tak, przyjmuje tę wartość, jeśli nie, przyjmuje wartość po ||.
Wartości, dla których przyjmie wartość po || (o ile pamiętam):
źródło
Chociaż odpowiedź Cletusa jest poprawna, uważam, że należy dodać więcej szczegółów w odniesieniu do „ewaluacji do fałszu” w JavaScript.
Nie tylko sprawdza, czy podano tytuł / msg, ale także czy którykolwiek z nich jest fałszywy . tj. jeden z następujących:
Więc w kolejce
Jeśli tytuł jest zgodny z prawdą (tj. Nie jest fałszem, więc tytuł = „titleMessage” itp.), To operator logiczny OR (||) znalazł jedną „prawdziwą” wartość, co oznacza, że zwraca wartość true, więc powoduje zwarcie i zwraca prawdziwa wartość (tytuł).
Jeśli tytuł jest fałszem (tj. Jedną z powyższych list), to operator logiczny OR (||) znalazł wartość „fałsz” i teraz musi ocenić drugą część operatora, „Błąd”, która ma wartość true i dlatego jest zwracany.
Wydaje się również (po szybkim eksperymentowaniu z konsolą firebug), że obie strony operatora oceniają na fałsz, zwraca drugi operator „fałsz”.
to znaczy
zwraca niezdefiniowany, prawdopodobnie pozwala to na użycie zachowania opisanego w tym pytaniu podczas próby ustawienia domyślnego tytułu / wiadomości na „”. tj. po uruchomieniu
foo byłoby ustawione na „”
źródło
operator podwójnej rury
czy ten przykład jest przydatny?
może też być
źródło
Aby dodać wyjaśnienie do wszystkich powiedzianych przede mną, powinienem podać kilka przykładów na zrozumienie logicznych pojęć.
Oznacza to, że jeśli lewa strona zostanie uznana za prawdziwą instrukcję, zostanie zakończona, a lewa strona zostanie zwrócona i przypisana do zmiennej. w innych przypadkach prawa strona zostanie zwrócona i przypisana.
A operator ma odwrotną strukturę jak poniżej.
źródło
|| jest logicznym operatorem OR. Podobnie jak w javascript, niezdefiniowane, null, 0, false są uważane za wartości fałszowania .
To po prostu znaczy
źródło
Cytat: „Co oznacza konstrukcja x = x || y?”
Przypisywanie wartości domyślnej.
Oznacza to podanie wartości domyślnej od y do x , w przypadku gdy x nadal czeka na swoją wartość, ale jeszcze jej nie otrzymał lub celowo pominięto w celu przywrócenia wartości domyślnej.
źródło
function getKeys(x) { x = x || this ; .... }
który może być używany bez modyfikacji jako samodzielna funkcja, jako metoda właściwości w prototypach oraz jako metoda elementu, który może uzyskać inny element jako argument jako „[element] .getKeys (anotherElement);`I muszę dodać jeszcze jedną rzecz: ta krótka skrótowa jest obrzydliwością. Niewłaściwie wykorzystuje przypadkową optymalizację interpretera (nie zawracając sobie głowy drugą operacją, jeśli pierwsza jest prawdziwa) do kontrolowania zadania. Takie zastosowanie nie ma nic wspólnego z celem operatora. Nie wierzę, że należy go kiedykolwiek wykorzystać.
Wolę operator trójskładnikowy do inicjalizacji, np.
Wykorzystuje jednowierszową operację warunkową do poprawnego celu. Nadal gra w nieestetyczne gry z prawdomównością, ale dla Ciebie to Javascript.
źródło