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, truea 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 ifklauzuli:
(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 xbył falsey, eitherXorYbyłoby y. W takim przypadku zrozumiałbyś, że "Either x or y is truthy."jeśli yto 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 || yznaczy. Jeśli xjest prawdą, xjest przypisane x, więc tak naprawdę nic się nie dzieje; w przeciwnym razie yjest 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 undefinedlub 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ł falsejako flagAparametr (ponieważ jest to wartość logiczna, tzn. Może być truelub false)? To się stanie true. W tym przykładzie nie ma możliwości ustawienia flagAna false.
Byłoby to lepszy pomysł, aby jednoznacznie sprawdzić, czy flagAto 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 .
falsyNIE, TYLKOundefined. Liczba razy, które widziałamdoWeDoIt = doWeDoIt || true, wystarcza, by płakać. (tj.doWeDoItteraz już nigdy nie będziefalse)