Po pierwsze, fakty:
if (booleanValue)
Zaspokoi if
oświadczenie o dowolnej wartości truthy z booleanValue
tym true
, każda niezerowa liczba, każdy niepusty ciąg znaków, dowolny obiekt lub tablica referencyjna, itd ...
Z drugiej strony:
if (booleanValue === true)
Spowoduje to spełnienie if
warunku tylko wtedy, gdy booleanValue
jest dokładnie równe true
. Żadna inna prawdziwa wartość tego nie zadowoli.
Z drugiej strony, jeśli to zrobisz:
if (someVar == true)
Następnie JavaScript wykona wpisanie przymusu, true
aby dopasować typ, someVar
a następnie porównać dwie zmienne. Jest wiele sytuacji, w których prawdopodobnie nie jest to zamierzone. Z tego powodu w większości przypadków chcesz tego uniknąć, ==
ponieważ istnieje dość długi zestaw reguł dotyczących tego, w jaki sposób JavaScript wymusza dwie rzeczy, aby były tego samego typu, chyba że rozumiesz wszystkie te zasady i możesz przewidzieć wszystko, co interpreter JS może zrobić, gdy biorąc pod uwagę dwa różne typy (których większość programistów JS nie potrafi), prawdopodobnie chcesz ==
całkowicie uniknąć .
Jako przykład tego, jak zagmatwany może być:
var x;
x = 0;
console.log(x == true); // false, as expected
console.log(x == false); // true as expected
x = 1;
console.log(x == true); // true, as expected
console.log(x == false); // false as expected
x = 2;
console.log(x == true); // false, ??
console.log(x == false); // false
Jeśli chodzi o wartość 2
, można by pomyśleć, że 2
jest to prawdziwa wartość, więc można by ją porównać korzystnie true
, ale nie tak działa wymuszanie typu. Konwertuje wartość prawej ręki, aby dopasować typ wartości lewej ręki, więc konwertuje true
ją na liczbę, 1
więc porównuje, 2 == 1
co z pewnością nie jest tym, co prawdopodobnie zamierzałeś.
Więc strzeż się kupującego. Prawdopodobnie najlepiej jest tego unikać ==
w prawie wszystkich przypadkach, chyba że dokładnie znasz typy, które będziesz porównywać, i wiesz, jak działają wszystkie możliwe algorytmy wymuszania typów.
Tak więc naprawdę zależy to od oczekiwanych wartości booleanValue
i sposobu działania kodu. Jeśli wiesz z góry, że będzie miał tylko wartość a true
lub false
, porównaj ją jawnie z
if (booleanValue === true)
to tylko dodatkowy kod i niepotrzebne i
if (booleanValue)
jest bardziej kompaktowy i prawdopodobnie czystszy / lepszy.
Jeśli z drugiej strony nie wiesz, co booleanValue
może być i chcesz sprawdzić, czy jest naprawdę ustawiona na true
bez innych automatycznych konwersji typów, to
if (booleanValue === true)
to nie tylko dobry pomysł, ale wymagany.
Na przykład, jeśli spojrzysz na implementację .on()
w jQuery, ma ona opcjonalną wartość zwracaną. Jeśli wywołanie zwrotne powróci false
, jQuery automatycznie zatrzyma propagację zdarzenia. W tym konkretnym przypadku, ponieważ jQuery chce propagacji zatrzymują się tylko jeśli false
został zwrócony, sprawdzić ich wartość zwracana explicity za === false
bo nie chcą undefined
lub 0
lub ""
lub cokolwiek innego, co spowoduje automatyczne typu nawróconego false aby również spełniać porównanie.
Na przykład, oto kod wywołania zwrotnego obsługi zdarzenia jQuery:
ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args );
if ( ret !== undefined ) {
event.result = ret;
if ( ret === false ) {
event.preventDefault();
event.stopPropagation();
}
}
Widać, że jQuery wprost szuka ret === false
.
Ale jest też wiele innych miejsc w kodzie jQuery, w których prostsze sprawdzenie jest właściwe, biorąc pod uwagę pożądany kod. Na przykład:
// The DOM ready check for Internet Explorer
function doScrollCheck() {
if ( jQuery.isReady ) {
return;
}
...