2013-10-02 7 views
22

Ich habe viele Fehler in meinem Code gefunden, weil ich diesen Ausdruck erwartet habe:JavaScript: leeres Array, [] wird in bedingten Strukturen als wahr ausgewertet. Warum ist das?

Boolean([]);, um zu false auszuwerten.

Aber das war nicht der Fall, wie es auf wahr ausgewertet wurde.

Daher Funktionen, die zurückgegeben möglicherweise [] wie folgt aus:

// Where myCollection possibly returned [ obj1, obj2, obj3] or [] 
if(myCollection) 
{ 
    // ... 

}else 
{ 
    // ... 
} 

hat die Dinge nicht tun erwartet.

Bin ich falsch angenommen [] ein leeres Array?

Ist dieses Verhalten auch in allen Browsern konsistent? Oder gibt es da auch irgendwelche Probleme? Ich habe dieses Verhalten übrigens in Goolgle Chrome beobachtet.

+0

Arrays sind Objekte, Objekte sind truthy. Fragen Sie einfach nach array.length, wenn nicht null, wird es truthy. Wenn Sie explizit in Boolean konvertieren, wird das Array zuerst zu einem leeren String, dann wird der leere String zu false. – dandavis

+0

Warum verwenden Sie 'myCollection.length> 0' nicht? – Steve

+0

@Steve - das wird nicht funktionieren, wenn 'myCollection'' null' oder 'undefined' ist. Sie müssen 'if (myCollection && myCollection.length> 0)' verwenden. –

Antwort

35

Von http://www.sitepoint.com/javascript-truthy-falsy/

Die folgenden Werte sind immer falsy:

  • falsch
  • 0 (Null)
  • "" (leere Zeichenkette)
  • null
  • undefined
  • NaN (ein spezieller Wert Nummer Bedeutung Nicht-a-Number)

Alle anderen Werte sind truthy, einschließlich "0" (Null in Anführungszeichen), "false" (falsch in Anführungszeichen), leere Funktionen , leere Arrays und leere Objekte.

5

Sie sollten die .length dieses Arrays überprüfen, um festzustellen, ob es irgendwelche Elemente enthält.

if (myCollection) // always true 
if (myCollection.length) // always true when array has elements 
if (myCollection.length === 0) // same as is_empty(myCollection) 
+0

@Steve Warum ist das? – marczellm

+0

@marczellm Dieser Kommentar von Steve ist veraltet, er benachrichtigt DevIshOne über die fehlende Bedingung _ "wenn Array Elemente hat" _, die daher in [der Bearbeitung] korrigiert wurde (http://stackoverflow.com/posts/19146220/revisions) . – mucaho

Verwandte Themen