2009-10-23 16 views
5

Zawsze uważałem, że instrukcja if w zasadzie porównała swój argument podobny do argumentu == true. Jednak następujący eksperyment w Firebug potwierdziła moje najgorsze obawy-po napisaniu Javascript przez 15 lat I nadal nie mają pojęcia WTF się dzieje:Co to jest semantyka JavaScriptów Jeśli Statement

>>> " " == true 
false 
>>> if(" ") console.log("wtf") 
wtf 

Mój światopogląd jest w rozsypce tutaj. Mógłbym przeprowadzić kilka eksperymentów, aby dowiedzieć się więcej, ale nawet wtedy traciłbym sen ze strachu przed dziwactwami przeglądarki. Czy to gdzieś jest w specyfikacji? Czy jest to spójna przeglądarka? Czy kiedykolwiek opanuję javascript?

+0

dziwne, jestem ciekawa odpowiedzi – theraccoonbear

Odpowiedz

7

"Jeśli dwa operandy nie są tego samego typu, JavaScript konwertuje operandy, a następnie stosuje ścisłe porównanie.Jeśli dowolny operand jest liczbą lub wartością logiczną, operandy są konwertowane na liczby, jeśli dowolny operand jest łańcuchem, inny jest konwertowany na ciąg znaków."

https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Comparison_Operators

Więc pierwsza robi:

Number(" ")==Number(true) 

podczas gdy druga jest oceniany tak:

if(Boolean(" ")==true) console.log("wtf") 
+0

To jest najbardziej sensowne wytłumaczenie. Instrukcja if jest rzutowana na Boolean. Punkty bonusowe, jeśli ktokolwiek może znaleźć specyfikację dla tego zachowania. – gtd

+1

Cóż, w dokumentach Mozilla można powiedzieć, że konwersja ma miejsce w instrukcji if: "Dowolna wartość, która nie jest niezdefiniowana, zero, 0, NaN lub pusty ciąg znaków (" ") i dowolny obiekt, w tym Obiekt Boolean, którego wartość jest równa false, zwraca wartość true po przekazaniu do instrukcji warunkowej. " – kloffy

+0

A to dotyczące konwersji za pomocą wartości logicznej (wartość): "Jeśli wartość jest pominięta lub wynosi 0, -0, zero, fałsz, NaN, niezdefiniowana lub pusty ciąg (" "), obiekt ma wartość początkową" fałsz ". " – kloffy

3

Zgaduję, że to pierwsza część, która jest problemem, a nie druga.

Prawdopodobnie robi jakieś dziwne odlewania (najprawdopodobniej true jest odlewana na ciąg zamiast " " jest wrzucony do wartości logicznej.

Co robi zwrot Firebug dla Boolean(" ")?

+0

Moja pierwsza reakcja była taka, myślę, że masz rację. – Jonas

+0

Cóż, święte wojny były utrwalane jedynie przez definicję prawdy w językach programowania, ale w javascriptie właśnie założyłem, że ponieważ == oznacza rzucanie, a === jest dokładnym dopasowaniem, == prawdziwa byłaby naturalną definicją prawdy. – gtd

+0

Boolean ("") => true Boolean ("") => false – gtd

0

Polecam używanie == = o ile to możliwe, jeśli tylko, aby uniknąć kryzysów egzystencjalnych.

+0

To jest czysto głupie. String.prototype.f = function() {return this}; "foo" .f() === "foo" // jaki jest wynik? Tożsamość to tożsamość. Jest to przypadek szczególny, a nie normalny. –

3

JavaScript może być dziwaczne rzeczy jak ta. Zauważ, że JavaScript ma == ale również ===. myślałem, że

" " == true 

byłoby true, ale

" " === true 

byłoby false. Operator === nie wykonuje konwersji; sprawdza, czy wartość i typ po obu stronach operatora są takie same. == przekształca wartości "prawdy" w wartości true i "falsy" w wartości false.

To może być odpowiedź - od JavaScript Comparison Operators dokumentacji (Mozilla):

równe (==)

Jeżeli oba argumenty nie są tego samego typu, JavaScript konwertuje argumentów następnie stosuje ścisłe porównanie. Jeśli dowolny argument jest liczbą lub wartością logiczną, operandy są konwertowane na liczby; jeśli dowolny operand jest łańcuchem, drugi jest konwertowany na ciąg znaków

Wysoce zalecany: Douglas Crockford on JavaScript.

+0

Dobry link, miałem Javascript: dobre części, ale nie wiem, dokąd uciekło. – gtd

2

Odpowiedź: aTruthyValue i prawda nie są takie same.

Se Mantyka instrukcji if jest łatwa:

if(aTruthyValue) { 
    doThis 
} else { 
    doThat 
} 

Teraz jest to tylko definicja wartości prawdy. Wartość prawdy nie jest, niestety, czymś, co jest po prostu "== true" lub "=== true".

ECMA-262 1.5 Zestaw 9.2 wyjaśnia, jakie wartości są prawdziwe, a które nie.

+1

+1 za najbardziej bezpośrednią odpowiedź, a także jako link do * rzeczywistej * specyfikacji! –