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:
- Jeśli pierwsza wartość to
false
, sprawdza drugą wartość. Jeśli tak true
, to wraca, true
a jeśli tak false
, to wracafalse
.
- Jeśli pierwszą wartością jest
true
, zawsze zwraca true
, bez względu na drugą wartość.
Zasadniczo działa to tak:
function or(x, y) {
if (x) {
return true;
} else if (y) {
return true;
} else {
return false;
}
}
Jeśli nadal nie rozumiesz, spójrz na tę tabelę:
| true false
------+---------------
true | true true
false | true false
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:
(function(){}) || {}
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 jako false
; 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:
- Jeśli pierwszą wartością jest falsey , zwraca drugą wartość .
- Jeśli pierwsza wartość jest zgodna z prawdą , zwraca pierwszą wartość .
Zaskoczony? W rzeczywistości jest „kompatybilny” z tradycyjnym ||
operatorem. Można go zapisać jako następującą funkcję:
function or(x, y) {
if (x) {
return x;
} else {
return y;
}
}
Jeśli przekażesz prawdziwą wartość jako x
, zwraca ona x
, to znaczy prawdziwą wartość. Więc jeśli użyjesz go później w if
klauzuli:
(function(x, y) {
var eitherXorY = x || y;
if (eitherXorY) {
console.log("Either x or y is truthy.");
} else {
console.log("Neither x nor y is truthy");
}
}(true/*, undefined*/));
dostajesz "Either x or y is truthy."
.
Gdyby to x
był falsey, eitherXorY
byłoby y
. W takim przypadku zrozumiałbyś, że "Either x or y is truthy."
jeśli y
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 to x = x || y
znaczy. Jeśli x
jest prawdą, x
jest przypisane x
, więc tak naprawdę nic się nie dzieje; w przeciwnym razie y
jest przypisany do x
. 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 (niekoniecznie undefined
lub null
) jako parametru. Rozważ następujący przykład:
function badFunction(/* boolean */flagA) {
flagA = flagA || true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
Wygląda na ważne od pierwszego wejrzenia. Co by się jednak stało, gdybyś podał false
jako flagA
parametr (ponieważ jest to wartość logiczna, tzn. Może być true
lub false
)? To się stanie true
. W tym przykładzie nie ma możliwości ustawienia flagA
na false
.
Byłoby to lepszy pomysł, aby jednoznacznie sprawdzić, czy flagA
to undefined
, tak:
function goodFunction(/* boolean */flagA) {
flagA = typeof flagA !== "undefined" ? flagA : true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
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 .
falsy
NIE, TYLKOundefined
. Liczba razy, które widziałamdoWeDoIt = doWeDoIt || true
, wystarcza, by płakać. (tj.doWeDoIt
teraz już nigdy nie będziefalse
)