Poniższe informacje pokazują, że "0"
w Javascript jest fałszem:
>>> "0" == false
true
>>> false == "0"
true
Dlaczego więc drukuje następujący "ha"
?
>>> if ("0") console.log("ha")
ha
javascript
boolean
niepolarność
źródło
źródło
"0"
jest ciągiem, a ponieważ nie jest pusty, jest sprawdzany jako prawdziwy."0" === false [...] false
'0'==false
ale „0” nie jest wartością falsey (tak JavaScript może być dziwny)==
, nigdy nie zostaną one przekonwertowane na wartości logiczne, więc nie ma zastosowania. (Reguły konwersji wydają się sprzyjać konwersji na liczby.)Odpowiedzi:
Powodem jest to, że gdy to zrobisz
"0" == false
, obie strony są konwertowane na liczby, a następnie przeprowadzane jest porównanie.Gdy to zrobisz:
if ("0") console.log("ha")
wartość ciągu jest testowana. Każdy niepusty ciąg jesttrue
, a pusty ciąg jestfalse
.źródło
Tabele przedstawiające problem:
i ==
Morał z tej historii ===
kredyt na generowanie tabeli: https://github.com/dorey/JavaScript-Equality-Table
źródło
NaN
. To znaczy,typeof NaN // number
aleNaN === NaN // false
, hmm ...NaN
, więc gdy porównujesz 2 NaN, mają one różne wartości (tak myślę). Przeczytaj pierwszy cytat tutaj .==
ani===
operator dla[]
,{}
,[[]]
,[0]
i[1]
wartości nie oceniać true. Mam na myśli,[] == []
a[] === []
także fałsz.Jest to zgodne ze specyfikacją.
ToBoolean, zgodnie ze specyfikacją, to
I ta tabela mówi o ciągach:
Teraz, aby wyjaśnić, dlaczego
"0" == false
powinieneś przeczytać operator równości, który stwierdza, że pobiera swoją wartość z operacji abstrakcyjnej, jestGetValue(lref)
taki sam dla prawej strony.Który opisuje tę istotną część jako:
Innymi słowy, łańcuch ma prymitywną podstawę, która wywołuje wewnętrzną metodę get i kończy się na fałszu.
Jeśli chcesz oceniać rzeczy za pomocą operacji GetValue użyj
==
, jeśli chcesz oceniać za pomocąToBoolean
, użyj===
(również znany jako „ścisły” operator równości)źródło
"a string has a primitive base, which calls back the internal get method and ends up looking false"
Czy to prawda dla wszystkich ciągów?Section 8.12.3: [[Get]] (P)
opisuje, jak to działa. Jest to prawdą tylko w przypadkach, gdy ciąg znaków ma wartość 0, ponieważ wykonuje kilka innych wywołań wewnętrznych, w wynikuGetOwnProperty
których widzi, że „cokolwiek” jest właściwością danych, która następnie zwraca tę wartość z powrotem. Dlatego „0” jest fałszem, a „bla” jest prawdą. Sprawdź niektóre z filmów Douglasa Crockforda w teatrze programistów Yahoo, opisuje on w JavaScripcie „prawdomówność” nieco mniej skomplikowany niż ja. Jeśli zrozumiesz, co oznacza „prawda” i „fałsz”, od razu zrozumiesz odpowiedź Bobince'a.To PHP, w którym ciąg znaków
"0"
jest fałszem (false-when-used-in-boolean-context). W JavaScript wszystkie niepuste ciągi są zgodne z prawdą.Sztuka polega na tym, że w
==
przypadku wartości logicznej nie jest obliczana w kontekście logicznym, konwertuje się na liczbę, aw przypadku ciągów, które są wykonywane przez parsowanie jako dziesiętne. Więc dostajesz liczbę0
zamiast boolean z prawdomównościtrue
.To naprawdę kiepski projekt językowy i jest to jeden z powodów, dla których staramy się nie używać niefortunnego
==
operatora. Użyj===
zamiast tego.źródło
źródło
Twoje cudzysłowy
0
tworzą ciąg, który jest oceniany jako prawdziwy.Usuń cytaty i powinno działać.
źródło
To wszystko ze względu na specyfikacje ECMA ... z
"0" == false
powodu określonych tutaj reguł http://ecma262-5.com/ELS5_HTML.htm#Section_11.9.3 ... Iif ('0')
ocenia się na prawdę z powodu określonych tutaj reguł http: / /ecma262-5.com/ELS5_HTML.htm#Section_12.5źródło
Wyrażenie „if” sprawdza prawdziwość, a testy podwójnej równości dla równoważności niezależnej od typu. Ciąg jest zawsze prawdziwy, jak zauważyli inni tutaj. Gdyby podwójna równość testowała oba argumenty pod kątem prawdziwości, a następnie porównywała wyniki, to uzyskałbyś wynik, który intuicyjnie zakładałeś, tj
("0" == true) === true
. Jak mówi Doug Crockford w swoim doskonałym skrypcie JavaScript: dobre części , „zasady, według których [== wymusza typy operandów] są skomplikowane i nie można ich zapamiętywać ... Brak przechodniości jest alarmujący”. Wystarczy powiedzieć, że jeden z operandów jest wymuszony na typ, aby pasował do drugiego, i że „0” kończy się interpretacją jako zero numeryczne,źródło
== Operator równości ocenia argumenty po przekonwertowaniu ich na liczby. Zatem ciąg zerowy „0” jest konwertowany na typ danych Liczba, a wartość logiczna „fałsz” jest konwertowana na liczbę 0. Tak
To samo dotyczy `
=== Ścisła kontrola równości ocenia argumenty z oryginalnym typem danych
To samo dotyczy
W
Łańcuch „0” nie jest porównywany z żadnymi argumentami, a łańcuch jest prawdziwą wartością, dopóki nie zostanie porównany z jakimikolwiek argumentami. To jest dokładnie jak
Ale
`
źródło
Wynika to z faktu, że JavaScript używa przymusu typu w kontekstach boolowskich i kodzie
zostanie wymuszony na true w kontekście boolowskim.
Istnieją inne prawdziwe wartości w Javascript, które zostaną wymuszone na true w kontekstach boolowskich, a zatem wykonają blok if:
źródło
wymusza x za pomocą wewnętrznego toBoolean JavaScript (http://es5.github.com/#x9.2)
zmusza obie strony za pomocą wewnętrznego przymusu toNumber (http://es5.github.com/#x9.3) lub toPrimitive dla obiektów (http://es5.github.com/#x9.1)
Aby uzyskać szczegółowe informacje, patrz http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/
źródło