182 votes

Pourquoi les tableaux JavaScript vides sont-ils évalués à true dans les structures conditionnelles?

J'ai rencontré beaucoup de bugs dans mon code parce que je m'attendais à ce que cette expression :

Boolean([]); évalue à faux.

Mais ce n'était pas le cas car elle a évalué à vrai.

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

// Où myCollection retourne éventuellement [ obj1, obj2, obj3] ou []
if(myCollection)
{
  // ...

}else
{
  // ...
}

n'ont pas fait ce à quoi je m'attendais.

Suis-je dans l'erreur en supposant que [] est un tableau vide ?

Aussi, ce comportement est-il cohérent dans tous les navigateurs ? Ou y a-t-il aussi des pièges ? J'ai observé ce comportement dans Google Chrome d'ailleurs.

200voto

Barmar Points 135986

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

Les valeurs suivantes sont toujours fausses:

  • false
  • 0 (zéro)
  • 0n (BigInt zéro)
  • "" (chaîne vide)
  • null
  • undefined
  • NaN (une valeur spéciale Number signifiant Not-a-Number!)

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

En ce qui concerne pourquoi c'est ainsi, je soupçonne que c'est parce que les tableaux JavaScript ne sont qu'un type particulier d'objet. Traiter les tableaux de manière spéciale nécessiterait des frais supplémentaires pour tester Array.isArray(). De plus, cela serait probablement déroutant si les vrais tableaux se comportaient différemment des autres objets de type tableau dans ce contexte, tandis que faire en sorte que tous les objets de type tableau se comportent de la même manière serait encore plus coûteux.

47voto

DevlshOne Points 5189

Vous devriez vérifier la .length de ce tableau pour voir s'il contient des éléments.

if (myCollection) // toujours vrai
if (myCollection.length) // toujours vrai lorsque le tableau contient des éléments
if (myCollection.length === 0) // pareil que is_empty(myCollection)

15voto

bvdb Points 898

Tandis que [] équivaut à false, il s'évalue à true.

oui, cela semble mauvais ou du moins un peu confus. Jetez un œil à ceci:

const arr = [];
if (arr) console.log("[] est true");
if (arr == false) console.log("cependant, [] == false");

En pratique, si vous souhaitez vérifier si quelque chose est vide, vérifiez la longueur. (L'opérateur ?. s'assure que même null est couvert.)

const arr = []; // ou null;
if (!arr?.length) console.log("vide ou null")

12voto

Abir Points 140
[]==false  // returns true

Cela évalue à true, en raison de l'Algorithme d'Égalité Abstrait tel que mentionné ici dans la Spécification ECMA #Section 11.9.3

Si vous parcourez l'algorithme mentionné ci-dessus.

Lors de la première itération, la condition satisfaite est,

Étape 7: Si le Type(y) est Boolean, retourner le résultat de la comparaison x == ToNumber(y).

Par conséquent, la condition ci-dessus se transforme en -> [] == 0

Maintenant, lors de la deuxième itération, la condition satisfaite sur [] == 0:

Étape 9: Si le Type(x) est Object et le Type(y) est soit String ou Number, retourner le résultat de la comparaison ToPrimitive(x) == y.

[] est un objet, donc, en le convertissant en primitif, il se transforme en une chaîne vide ''

Ainsi, la condition ci-dessus se transforme en -> '' == 0

Lors de la troisième itération, la condition satisfaite est:

Étape 5: Si le Type(x) est String et le Type(y) est Number, retourner le résultat de la comparaison ToNumber(x) == y.

Comme nous le savons, une chaîne vide, '' est une valeur falsy, donc transformer une chaîne vide en un nombre nous renverra une valeur 0.

Ainsi, notre condition se transformera en -> 0 == 0

Lors de la quatrième itération, la première condition est satisfaite, où les types sont égaux et les nombres sont égaux.

Par conséquent, la valeur finale du [] == false se réduit à 0 == 0 qui est vrai.

J'espère que cela répond à votre question. Sinon, vous pouvez également consulter cette vidéo youtube

1voto

Max Senisch Points 11

Je soupçonne que cela a quelque chose à voir avec les mathématiques discrètes et la façon dont fonctionne une conditionnelle (si alors). Une conditionnelle a deux parties, mais dans le cas où la première partie n'existe pas, quel que soit la deuxième partie, elle renvoie quelque chose appelé une vérité vacante.

Voici l'exemple cité sur la page wikipedia des vérités vacantes

"L'affirmation "tous les téléphones portables dans la pièce sont éteints" sera vraie lorsque aucun téléphone portable ne se trouve dans la pièce. Dans ce cas, l'affirmation "tous les téléphones portables dans la pièce sont allumés" serait également vacueusement vraie"

La wikipedia mentionne même spécifiquement JavaScript un peu plus tard.

https://fr.wikipedia.org/wiki/Vérité_vacante#:~:text=En%20mathématiques%20et%20logique%2C%20une,l'antécédent%20ne%20peut%20pas%20être%20satisfait.&text=Un%20exemple%20de%20ce%20type%20d'une,%22la%20tour%20Eiffel%20est%20en%20Bolivie%22.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X