2011-01-07 13 views
5

Betrachten leer JavaScript-Array:JavaScript type casting

var a = []; 
alert(a == false); // shows true 
alert(!a); // shows false! 

Wie dies zu erklären? Was sind die Regeln?

+1

mögliches Duplikat von [Warum Alert (!! "0") und alert (false == "0") beide in JavaScript "true" ausgeben) (http://stackoverflow.com/questions/4567393/why-do -alert0-and-alertfalse-0-both-output-true-in-javascript) – SLaks

+1

Danke für das Zeigen. Aber nicht genau, ich frage nach generischen Regeln. – Evgenyt

+2

Wenn es um den lockeren Operator '== geht, sind die Regeln nicht so allgemein.Sie sollten den Abstract Equality Comparison-Algorithmus lesen, auf den [diese Antwort] verweist (http://stackoverflow.com/questions/4626361/javascript-type-casting/4626420#4626420). – user113716

Antwort

12

Von http://forums.whirlpool.net.au/archive/966449:

a == false:

In diesem Fall wird die Art der linken Seite Objekt ist, die Art der rechten Seite ist boolean. JavaScript konvertiert zuerst den Booleschen Wert in eine Zahl und liefert 0. Dann konvertiert es das Objekt in ein "primitives" und liefert die leere Zeichenkette. Als nächstes vergleicht es die leere Zeichenfolge mit 0. Die leere Zeichenfolge wird in eine Zahl konvertiert, die 0 ergibt, die auf der rechten Seite numerisch gleich 0 ist, so dass das Ergebnis des gesamten Ausdrucks true ist.

Siehe §11.9.3 der ECMAScript spec für alle blutigen Details.

(!a):

In diesem Fall wandelt Javascript, um das Objekt in dem boolean true, dann invertiert, in falschen führt.

+0

+1 Gute und richtige Antwort (oder Verweis auf eine richtige Antwort, denke ich). – user113716

+0

Hier ist ein direkter Link zu der oben genannten ECMA-Spezifikation: http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3 – JKirchartz

8

Der Operator ! prüft, ob sein Operand "falsy" ist.

Die folgenden Bedingungen erfüllt sind:

  • !false
  • !0
  • !null
  • !NaN
  • !undefined
  • !""

Der Operator == prüft auf lose Gleichheit, die nichts mit Falschheit zu tun hat.

Konkret wird a == b in Operanden in Zahlen konvertieren und dann die Zahlen vergleichen.
Strings, die Zahlen enthalten, werden in die Zahlen konvertiert, die sie enthalten. booleans konvertieren zu 0 und 1.
Objekte werden durch Aufruf von valueOf konvertiert, falls definiert.

Somit sind alle der folgenden Bedingungen erfüllt sind:

  • "1" == 1
  • "0" == false
  • "1" == true
  • "2" != true
  • "2" != false
  • ({ valueOf:function() { return 2; } }) == 2
  • ({ valueOf:function() { return 1; } }) == true
+0

+1 Sie haben mich dazu geschlagen! –

+2

Wie sind ("2"! = Wahr), ("2"! = Falsch) beide wahr? – qwertymk

+2

@qwerty: So wie '2! = 3' und' 2! = 4' sind beide wahr – SLaks

1

Wenn ein Objekt in einen Grundwert über die Bedien == Vergleich nötigt das Objekt in einen primitiven Wert selbst (Zahl oder Zeichenkette). In diesem Fall [] in 0 nötigt, dann nötigt false in 0:

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

was wahr ist.

Der !-Operator wird in Boolesche Werte umgewandelt und invertiert den Wert. [] in boolean ist true (wie bei jedem Objekt). invertieren dann false

![] 
!true 
false 
4

Der == Operator, wenn einer der Operanden werden, wenn Boolean, die anderen Zahlentyp konvertiert.

[] == 0; 

entspricht:

0 == 0; 

Sie können die vollständigen Details der The Abstract Equality Comparison Algorithm auf der Spezifikation.

Wie Sie sehen können, wird ein leeres Array-Objekt, wenn sie auf eine Zahl umgewandelt, produziert 0:

+[]; // 0 
Number(0); 

Das ist wirklich, weil seine toString Methode einen leeren String erzeugt, zum Beispiel:

[].toString(); // "" 

+""; // 0 
Number(""); // 0 
+0

+1 Schöne Art, es zu erklären, durch die Typumwandlungen durchlaufen es geht durch. – user113716

0

Nicht sicher, ob dies die Frage beantwortet, aber es gibt eine neue Bibliothek, um alle Javascript-Seltsamkeiten von Javascript zu umgehen:

Typecast.js

In einem Satz löst Typecast alle einfachen Probleme, so dass Sie sich auf die großen konzentrieren können. Typecast behebt das Problem mit Javascript, indem eine vollständige Plattform für stark typisierte Variablen in Javascript erstellt wird.