JavaScript: tableau vide, [] prend la valeur true dans les structures conditionnelles. Pourquoi est-ce?

94

Je rencontrais beaucoup de bogues dans mon code car je m'attendais à cette expression:

Boolean([]); pour évaluer faux.

Mais ce n'était pas le cas car il évaluait à vrai.

Par conséquent, les fonctions qui ont éventuellement renvoyé []comme ceci:

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

}else
{
  // ...
}

je ne m'attendais pas aux choses.

Est-ce que je me trompe en supposant qu'un []tableau vide?

En outre, ce comportement est-il cohérent dans tous les navigateurs? Ou y a-t-il des pièges là aussi? D'ailleurs, j'ai observé ce comportement dans Goolgle Chrome.

racl101
la source
5
les tableaux sont des objets, les objets sont la vérité. demandez simplement array.length, sinon zéro, ce sera la vérité. lorsque vous convertissez explicitement en booléen, le tableau se transforme d'abord en une chaîne vide, puis la chaîne vide se transforme en false.
dandavis
1
Pourquoi n'utilisez-vous pas myCollection.length > 0?
Steve
1
@Steve - cela ne fonctionnera pas s'il myCollectionse trouve être nullou undefined. Vous devez utiliser if(myCollection && myCollection.length > 0).
Ted Hopp
@TedHopp - bien sûr ... Je faisais juste remarquer qu'il myCollection.length > 0offre une valeur booléenne qui fait ce que l'OP a demandé ... il doit encore faire le travail à partir de là.
Steve

Réponses:

108

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

Les valeurs suivantes sont toujours fausses:

  • faux
  • 0 (zéro)
  • "" (chaîne vide)
  • nul
  • indéfini
  • NaN (une valeur numérique spéciale signifiant Not-a-Number!)

Toutes les autres valeurs sont vraies, y compris "0" (zéro entre guillemets), "faux" (faux entre guillemets), les fonctions vides, les tableaux vides et les objets vides.

Barmar
la source
25
Si vous testez l'expression à laquelle [] == falseil est évalué true.
m.rufca
3
@ m.rufca Voir stackoverflow.com/questions/5491605/…
Barmar
il y a un petit tableau montrant des situations inattendues à ==l' aide du comparateur dans le lien que vous avez publié. J'ai commenté juste pour être prudent lorsque je m'attends à une évaluation vraie ou fausse.
m.rufca
4
Cela ne répond pas vraiment à la question, qui était POURQUOI. Pourquoi un tableau vide est-il véridique, quand une chaîne vide est fausse? En tant que décision de conception délibérée, cela semble très mauvais.
Esa Lindqvist
1
Peut-être, parce que ceux-ci doivent agir comme les objets primitifs. Mais Javascript n'a pas de tableaux primitifs.
Barmar
24

Vous devriez vérifier le .lengthde ce tableau pour voir s'il contient des éléments.

if (myCollection) // always true
if (myCollection.length) // always true when array has elements
if (myCollection.length === 0) // same as is_empty(myCollection)
DevlshOne
la source
@marczellm Ce commentaire de Steve est obsolète, il a notifié à DevIshOne la condition manquante "quand le tableau a des éléments" , qui a donc été corrigée dans l'édition .
mucaho