JavaScript: Warum ist [] ==! []?

8

In JavaScript habe ich festgestellt, dass []==![] result true ist. Demo

Ich verstehe dieses Ergebnis nicht. Kannst du erklären warum?

    
Koerr 13.10.2012, 08:10
quelle

1 Antwort

10

[] ist ein Array, aber ![] ist ein boolescher Wert. Immer wenn Sie versuchen, zwei Objekte mit verschiedenen Typen mit == zu vergleichen, sollten beide Objekte in vergleichbare Objekte transformiert werden (mit ToNumber , siehe Schritt 7. in 11.9.3). Deshalb liefert [] == ![] true, das erste leere Array wird zu false ausgewertet.

  

11.9.3 Der abstrakte Gleichheitsvergleichsalgorithmus

     

Der Vergleich x == y, wobei x und y Werte sind, ergibt wahr oder falsch. Ein solcher Vergleich wird als durchgeführt   folgt:

     
  1. [...]
  2.   
  3. Wenn x null ist und y nicht definiert ist, true zurück.
  4.   
  5. Wenn x nicht definiert ist und y null ist, true zurück.
  6.   
  7. Wenn Typ (x) Nummer und Typ (y) Zeichenfolge ist,   gebe das Ergebnis des Vergleichs zurück x == ToNumber (y).
  8.   
  9. Wenn Typ (x) String und Typ (y) Zahl ist,   geben Sie das Ergebnis des Vergleichs ToNumber (x) == y zurück.
  10.   
  11. Wenn Type (x) Boolean ist, geben Sie das Ergebnis des Vergleichs ToNumber (x) == y zurück.
  12.   
  13. Wenn Type (y) Boolean ist, gebe das Ergebnis des Vergleichs x == ToNumber (y) zurück.
  14.   
  15. Wenn Typ (x) entweder String oder Zahl und Typ (y) Objekt ist,   gebe das Ergebnis des Vergleichs zurück x == ToPrimitive (y).
  16.   
  17. Wenn Typ (x) Objekt und Typ (y) entweder Zeichenfolge oder Zahl ist,   Rückgabe des Ergebnisses des Vergleichs ToPrimitive (x) == y.
  18.   
  19. Gibt false zurück.
  20.   

Wenn Sie jedoch den strikten Typvergleichsoperator === verwenden, ist das Ergebnis falsch, da sich beide Typen unterscheiden:

  

11.9.6 Der Strict Equality Comparison-Algorithmus

     

Der Vergleich x === y, wobei x und y Werte sind, ergibt wahr oder falsch. Ein solcher Vergleich wird durchgeführt   wie folgt:

     
  1. Wenn sich Typ (x) von Typ (y) unterscheidet, geben Sie false zurück.
  2.   
  3. Wenn Typ (x) nicht definiert ist, geben Sie true zurück.
  4.   
  5. Wenn Typ (x) Null ist, gebe true zurück.
  6.   
  7. Wenn Typ (x) Nummer ist, dann   
    1. Wenn x NaN ist, gebe false zurück.
    2.   
    3. Wenn y NaN ist, gebe false zurück.
    4.   
    5. Wenn x derselbe Zahlenwert wie y ist, gib true zurück.
    6.   
    7. Wenn x +0 und y -0 ist, geben Sie true zurück.
    8.   
    9. Ist x gleich -0 und y ist +0, true zurück.
    10.   
    11. Gibt false zurück.
    12.   
  8.   
  9. Wenn Type (x) eine Zeichenfolge ist, geben Sie true zurück, wenn x und y genau die gleiche Zeichenfolge sind (gleiche Länge und   gleiche Zeichen in entsprechenden Positionen); Andernfalls gebe false zurück.
  10.   
  11. Wenn Typ (x) Boolesch ist, true zurück, wenn x und y beide wahr oder beide falsch sind; Andernfalls gebe false zurück.
  12.   
  13. Gibt true zurück, wenn sich x und y auf dasselbe Objekt beziehen. Andernfalls gebe false zurück.
  14.   
    
Zeta 13.10.2012, 08:22
quelle

Tags und Links