2014-03-06 23 views
7

Der folgende Ausdruck gibt 'A' wie erwartet aus, da der Datentyp unterschiedlich ist, sodass das Array in ein primitives Formular übernommen wird, das false für leere Arrays ist.Warum ist `[] == false` wahr, aber nur` [] `wird als wahr ausgewertet?

if ([] == false) 
    console.log('A'); 
else 
    console.log('B'); 

Aber warum dann der folgende Code "A" druckt?

if ([]) 
    console.log('A'); 
else 
    console.log('B'); 
+2

JavaScript-Typ Zwang - '[] === false' ist' false'. –

Antwort

7

Warum ist [] == false

Da Arrays verhalten sich seltsam wahr ist, wenn auf primitive Werten verglichen.

Insbesondere wenn Sie compare alle nicht-booleschen zu einem booleschen, wird der Boolean als eine Zahl behandelt. Dann, wenn Sie eine Zahl mit einem Objekt vergleichen, ist das Objekt converted to a primitive - das stringifies das Array vor dem Vergleich wieder mit der Nummer. Nun, das Zeichenfolge is converted to a number, damit sie verglichen werden:

[] == false 
[] == 0 
"" == 0 
0 == 0 

Ebenso können Sie

[1] == true 
[1] == 1 
"1" == 1 
1 == 1 

oder

[2] == true 
[2] == 1 
"2" == 1 
2 == 1 

aber nur [] true ausgewertet versuchen?

Weil any object is truthy.

1

[] ist ein leeres Array und anders als false, deshalb [] == false kehrt false WÄHREND [] kehrt true, weil es nicht auf, weil dieser equality rulesnull

2

Der erste Test zeigt true zurück:

Wenn einer der Operanden Boolean ist, wird der boolesche Operand in konvertiert 1 wenn es wahr ist und +0 wenn es falsch ist. Wenn ein Objekt mit einer Zahl oder einer Zeichenfolge verglichen wird, versucht JavaScript , den Standardwert für das Objekt zurückzugeben. Operatoren versuchen, das Objekt zu einem primitiven Wert, einem String oder einem Wert der Nummer mit den Methoden ValueOf und ToString der Objekte zu konvertieren. Wenn dieser Versuch, das Objekt zu konvertieren, fehlschlägt, wird ein Laufzeitfehler generiert.

(und ja, haben Sie [].toString()=="" und damit []==0)

Der zweite Test

if ([]) 

einfach übergeben wird, da alle Objekte Truish sind.

2

Der Operator == erzwingt eine Typumwandlung. [] als Boolean ist false. Warum passiert das nicht zB mit? "a" == false? Grundsätzlich ist der numerische Wert []0, während der numerische Wert "a"NaN ist. Wie vorauszusehen war, "0" == false ist true :)

Auf der anderen Seite, im zweiten Fall, sind Sie im Grunde überprüft nur, ob [] vorhanden ist („nicht null“). Es gibt kein Boolesches Casting.

Verwandte Themen