Czy ktoś może wyjaśnić dlaczego w javascript,

alert({} == true) pokazuje false

if ({}) alert('true') pokazuje true ?

Co jest inne w stanie, który zmienia wynik?

Chciałem napisać walidator Shorthand Argument obj || (obj = {}); i byłem zaskoczony tym odkryciem.

3
Cristi Mihai 30 sierpień 2012, 23:52

5 odpowiedzi

Najlepsza odpowiedź

if ({}) alert('true') - & gt; true

{} jest obiektem, który, który jest oceniany w kontekście oświadczenia if, zostaje wymuszony do Boolean, a od Boolean({}) oceniają {{x4 }} , otrzymasz if (true). Jest to udokumentowane w specyfikacji ECMAScript, sekcja 12.5 entuzji IF :

Wyroby produkcyjne: jeśli (wyrażenie) oświadczenie jest oceniane w następujący sposób:

  1. Niech Expref będzie wynikiem oceny wyrażenia.
  2. Jeśli TOBoolean (GetValue (Exprref)) jest fałszywy, zwrot (normalny, pusty, pusty).
  3. Zwróć wynik oceny oświadczenia.

alert({} == true) - & gt; false

Ten jest bardziej trudny. Z ECMASCRIP specyfikacja, sekcja 11.9.3 Algorytm porównania równości abstrakcyjnej :

Porównanie X == Y, gdzie X i Y są wartościami, wytwarza prawdziwe lub fałszywe. Takie porównanie jest wykonywane w następujący sposób:

Jeśli typ (y) jest boolowska, zwraca wynik porównania x == Tonumber (Y) .

Tak więc {} == true zostanie oceniona jako {} == Number(true), który jest oceniany do {} == 1, który jest false .

Dlatego też jest dlatego 1 == true ocenia się true, ale 2 == true oceniają false.

6
João Silva 31 sierpień 2012, 11:58

{} nie jest true, więc nie pojawi się w pierwszym przykładzie. W drugim przykładzie {} nie jest fałszywy, więc przejdzie test.

Jak mój nauczyciel mówić, nie możesz porównywać ziemniaków i marchwi.

To nie tylko z tablicami, będzie działać z czymkolwiek:

alert(3 == true); // shows false

if (3) alert('true'); // shows true
2
Tchoupi 30 sierpień 2012, 19:58

W operacjach boolowskich, na ogół wszystko, co nie jest 0 oceniają na true. http://jsfiddle.net/qf8gw/

if (0) console.log("0 shows true"); // does not log a value
if (-1) console.log("-1 shows true");
if (12345) console.log("12345 shows true");
if ({}) console.log("{} shows true");
if ([]) console.log("[] shows true");

Wszystkie z wyjątkiem 0 oceni się na prawdziwe.

Jednakże ich wartości, w porównaniu z true nie będą oceniane do true.

// logs the statement (1 and true are the same.)
​if (1 == true) console.log("1==true shows true");​​​​​​​​

if (12345 == true) console.log("12345==true shows true"); // does not log
2
Shmiddty 30 sierpień 2012, 20:06

Próbowałem w jsfiddle.net i tylko spróbuj w pierwszym alercie, mówi fałszywe, a jeśli nie alert prawda.

0
atiruz 30 sierpień 2012, 20:01
alert({} == true) //display "false"

if({} == true)
{
   alert("it's true");
}else
{
   alert("it's false"); // <-- alert this
}

(fragment)

0
Breno LarC 11 wrzesień 2012, 20:54