Dzisiaj dostałem uwagę na temat kodu, biorąc pod uwagę sposób, w jaki sprawdzam, czy zmienna jest prawdziwa, czy fałszywa w zadaniu szkolnym.
Kod, który napisałem, wyglądał mniej więcej tak:
var booleanValue = true;
function someFunction(){
if(booleanValue === true){
return "something";
}
}
Powiedzieli, że lepiej / schludniej napisać to w ten sposób:
var booleanValue = true;
function someFunction(){
if(booleanValue){
return "something";
}
}
Uwaga, którą otrzymałem na temat części „=== prawda” była taka, że nie jest ona potrzebna i może powodować zamieszanie.
Jednak moim pomysłem jest to, że lepiej jest sprawdzić, czy zmienna jest logiczna, czy nie, zwłaszcza, że JavaScript jest językiem o luźnym typie.
W drugim przykładzie łańcuch również zwróciłby „coś”;
Więc moje pytanie; Czy w przyszłości lepiej jest stracić część „=== true”, czy też dobrą praktyką jest sprawdzenie również typu zmiennej.
Edycja: W moim „prawdziwym” kodzie wartość logiczna reprezentuje, czy obraz został usunięty, czy nie, więc jedyne wartości, które powinna mieć wartość boolValue, to true lub false.
Na przykład 0 i 1 nie powinny znajdować się w tej zmiennej.
źródło
=== true
. Pozwala uniknąć nieporozumień !![0] === true
ocenia jako fałsz.=== true
gdy musisz upewnić się, że warunek jest dokładnie równytrue
.Odpowiedzi:
Po pierwsze, fakty:
Zaspokoi
if
oświadczenie o dowolnej wartości truthy zbooleanValue
tymtrue
, każda niezerowa liczba, każdy niepusty ciąg znaków, dowolny obiekt lub tablica referencyjna, itd ...Z drugiej strony:
Spowoduje to spełnienie
if
warunku tylko wtedy, gdybooleanValue
jest dokładnie równetrue
. Żadna inna prawdziwa wartość tego nie zadowoli.Z drugiej strony, jeśli to zrobisz:
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ć:
Jeśli chodzi o wartość
2
, można by pomyśleć, że2
jest to prawdziwa wartość, więc można by ją porównać korzystnietrue
, ale nie tak działa wymuszanie typu. Konwertuje wartość prawej ręki, aby dopasować typ wartości lewej ręki, więc konwertujetrue
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ść atrue
lubfalse
, porównaj ją jawnie zto tylko dodatkowy kod i niepotrzebne i
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 natrue
bez innych automatycznych konwersji typów, toto 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ócifalse
, jQuery automatycznie zatrzyma propagację zdarzenia. W tym konkretnym przypadku, ponieważ jQuery chce propagacji zatrzymują się tylko jeślifalse
został zwrócony, sprawdzić ich wartość zwracana explicity za=== false
bo nie chcąundefined
lub0
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:
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:
źródło
Jeśli napiszesz
if(x === true)
:, Będzie to prawda tylko dla x = prawdaJeśli napiszesz
if(x)
:, będzie prawdziwe dla każdego x, które nie jest: '' (pusty łańcuch), false, null, undefined, 0, NaN.źródło
NaN
i-0
.W zwykłym "if" zmienna zostanie przekształcona na wartość logiczną i używa toBoolean na obiekcie: -
Ale porównanie z === nie ma żadnego typu przymusu, więc muszą być równe bez przymusu.
Jeśli mówisz, że obiekt może nawet nie być wartością logiczną, być może będziesz musiał rozważyć więcej niż tylko prawda / fałsz.
źródło
To zależy od twojego przypadku. Może być sensowne sprawdzenie typu, ale jeśli jest to tylko flaga, tak nie jest.
źródło
===
Porównanie nie wykonuje typu przymus. Zatem kod OP skutecznie testuje typ flagi. Udaje się tylko wtedy, gdy wartość jest wartością logiczną i jest prawdziwa.Ogólnie rzecz biorąc, łatwiej jest pominąć rozszerzenie
=== true
.Jednak w Javascript te stwierdzenia są inne.
if (booleanValue)
wykona jeślibooleanValue
jest truthy - coś innego niż0
,false
,''
,NaN
,null
, iundefined
.if (booleanValue === true)
wykona tylko wtedy, gdybooleanValue
jest dokładnie równetrue
.źródło
''
.(===)
Operator tożsamości zachowuje się identycznie jak(==)
operator równości , z wyjątkiem tego, że nie jest wykonywana żadna konwersja typów, a typy muszą być takie same, aby były uznawane za równe.źródło
if (booleanValue)
iif (booleanValue==true)
kiedybooleanValue
jest2
. Te dwa stwierdzenia nie dają tego samego wyniku.Ponieważ zaznaczona wartość jest
Boolean
preferowana, zaleca się użycie jej bezpośrednio w celu zmniejszenia kodowania iw ogóle zrobiło to samo==true
źródło
Ponieważ już zainicjowałeś wyraźnie jako bool, myślę, że
===
operator nie jest wymagany.źródło
Jeśli zmienna może zawsze przyjmować tylko wartości logiczne, rozsądne jest użycie krótszej składni.
Jeśli może potencjalnie być przypisane inne typy, a trzeba odróżnić
true
od1
lub"foo"
, następnie należy użyć=== true
.źródło
Myślę, że twoje rozumowanie jest rozsądne. Jednak w praktyce stwierdziłem, że znacznie częściej pomija się
===
porównanie. Myślę, że są ku temu trzy powody:undefined
lubnull
wartość. Często chcesz po prostu, aby test zakończył się niepowodzeniem w takich przypadkach. (Chociaż staram się zrównoważyć ten pogląd hasłem „szybko przegrywaj”).Rozważmy ten przykład:
Myślę, że tego rodzaju kod nie jest rzadkością. Zajmuje się przypadki, w których
getInput()
powracaundefined
,null
lub pusty ciąg. Ze względu na dwie wartości logicznesubmitInput()
jest wywoływana tylko wtedy, gdy dane wejście jest łańcuchem zawierającym znaki inne niż białe znaki.W JavaScript
&&
zwraca swój pierwszy argument, jeśli jest fałszywy, lub drugi argument, jeśli pierwszy argument jest prawdziwy; taknormalized
będzie,undefined
jeślisomeString
było nieokreślone i tak dalej. Oznacza to, że żadne dane wejściowe do powyższych wyrażeń logicznych nie są w rzeczywistości wartościami logicznymi.Wiem, że wielu programistów, którzy są przyzwyczajeni do silnego sprawdzania typów, wzdraga się, widząc taki kod. Ale uwaga, stosowanie silnego pisania prawdopodobnie wymagałoby jawnych sprawdzeń dla
null
lubundefined
wartości, co zagraciłoby kod. W JavaScript nie jest to potrzebne.źródło
To zależy. Jeśli obawiasz się, że twoja zmienna może skończyć się jako coś, co zostanie rozwiązane jako PRAWDA. Wtedy twarde sprawdzenie jest koniecznością. W przeciwnym razie to zależy od Ciebie. Jednak wątpię, czy składnia
whatever == TRUE
kiedykolwiek zmyliłaby każdego, kto wiedział, co robią.źródło
W Javascript idea boolean jest dość niejednoznaczna. Rozważ to:
Więc kiedy używasz instrukcji if (lub jakiejkolwiek innej instrukcji sterującej), nie musisz używać zmiennej typu „boolean”. Dlatego moim zdaniem część "=== prawda" twojego stwierdzenia jest niepotrzebna, jeśli wiesz, że jest to wartość logiczna, ale jest absolutnie konieczna, jeśli twoja wartość jest niejednoznaczną zmienną "prawdziwą". Więcej na temat wartości logicznych w javscript można znaleźć tutaj .
źródło
Revisa https://www.w3schools.com/js/js_comparisons.asp
przykład:
=== oznacza ten sam typ i tę samą wartość == tę samą wartość
źródło
Można również przetestować za pomocą obiektu Boolean, jeśli chcesz przetestować obiekt
error={Boolean(errors.email)}
źródło