JavaScript: leeres Array, [] wird in bedingten Strukturen als wahr ausgewertet. Warum ist das?

90

Ich habe viele Fehler in meinem Code festgestellt, weil ich diesen Ausdruck erwartet habe:

Boolean([]); zu falsch bewerten.

Dies war jedoch nicht der Fall, da es als wahr bewertet wurde.

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

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

}else
{
  // ...
}

erwartete Dinge nicht.

Bin ich falsch in der Annahme, dass []ein leeres Array?

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

racl101
quelle
4
Arrays sind Objekte, Objekte sind wahr. Fragen Sie einfach nach array.length, wenn nicht Null, wird es wahr sein. Wenn Sie explizit in Boolean konvertieren, wird das Array zuerst in eine leere Zeichenfolge und dann in die leere Zeichenfolge in false umgewandelt.
Dandavis
1
Warum benutzt du nicht myCollection.length > 0?
Steve
1
@Steve - das wird nicht funktionieren, wenn myCollectionzufällig nulloder undefined. Sie müssen verwenden if(myCollection && myCollection.length > 0).
Ted Hopp
@ TedHopp - natürlich ... Ich habe nur darauf hingewiesen, dass dies myCollection.length > 0einen booleschen Wert bietet, der das tut, was das OP verlangt ... er muss die Arbeit von dort aus noch erledigen.
Steve

Antworten:

102

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

Die folgenden Werte sind immer falsch:

  • falsch
  • 0 (Null)
  • "" (leerer String)
  • Null
  • nicht definiert
  • NaN (ein spezieller Zahlenwert, der Not-a-Number bedeutet!)

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

Barmar
quelle
25
Wenn Sie den Ausdruck testen, wird [] == falseer ausgewertet true.
m.rufca
3
@ m.rufca Siehe stackoverflow.com/questions/5491605/…
Barmar
Es gibt eine Handvoll Tabellen, die unerwartete Situationen mit dem ==Komparator in dem von Ihnen geposteten Link zeigen. Ich habe nur kommentiert, um vorsichtig zu sein, wenn ich eine wahre oder falsche Bewertung erwarte.
m.rufca
4
Dies beantwortet nicht wirklich die Frage, warum. Warum ist ein leeres Array wahr, wenn eine leere Zeichenfolge falsch ist? Als bewusste Designentscheidung fühlt sich dies sehr schlecht an.
Esa Lindqvist
1
Vielleicht, weil diese sich wie die primitiven Objekte verhalten müssen. Aber Javascript hat keine primitiven Arrays.
Barmar
23

Sie sollten .lengthdas Array überprüfen , um festzustellen, ob es 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)
DevlshOne
quelle
@marczellm Dieser Kommentar von Steve ist veraltet. Er hat DevIshOne über die fehlende Bedingung "Wenn das Array Elemente enthält" informiert , die daher in der Bearbeitung korrigiert wurde .
Mucaho