« Programmation JavaScript/Variables » : différence entre les versions

Contenu supprimé Contenu ajouté
Touffy (discussion | contributions)
→‎string : plein de trucs en plus
Touffy (discussion | contributions)
→‎boolean : conversion et comparaison
Ligne 166 :
alert(typeof c); // Affiche "boolean"
</pre>
 
Dans une comparaison, les valeurs suivantes sont équivalentes (opérateur '''==''') à '''false''' :
* 0 : le nombre zéro et ses variations, du style 0.000, 0x0, 0e12, etc.
* "" : la chaîne vide
* "0" : la chaîne contenant le nombre zéro, et toutes ses variations, comme pour le nombre
* "false" : la chaîne "false"
* [] ou '''new''' '''Array'''() : un tableau vide
 
Par ailleurs, les valeurs suivantes donnent '''false''' si on les convertit (explicitement ou pas) en booléen, bien qu'elle ne soient pas toutes équivalentes par comparaison :
* 0 et ses variations
* ""
* null
* NaN
* undefined
 
Comme ces listes le montrent, une valeur peut être équivalente à '''false''' sans être considérée comme fausse elle-même ! Et inversement, une valeur considérée comme fausse n'est pas forcément équivalente au booléen '''false'''.
 
Cela peut sembler surprenant et illogique à première vue (et source de quelques bugs) mais il faut comprendre l'origine de ces différences :
* les valeurs '''null''', '''NaN''' et '''undefined''' refusent simplement d'être équivalentes à n'importe quoi sauf elles-mêmes. Donc l'opérateur '''==''' retournera systématiquement '''false''' si une des opérandes est '''null''', '''NaN''' ou '''undefined''' et que l'autre n'est pas strictement identique. Cependant, à choisir entre vrai ou faux (lors d'une conversion en '''Boolean''', il n'y a pas d'autre choix), ces valeurs sont plutôt '''false'''.
* les chaînes "0" et ses variantes sont... des chaînes, et '''false''' est un booléen. JavaScript ne peut pas comparer directement deux types différents. Il pourrait convertir la chaîne en booléen, mais préfère convertir les deux en '''number''' (le type '''number''' est plus "fort"). Le résultat est 0 == 0 la comparaison est donc vraie. Cependant, "0" reste une chaîne non-vide, et si on la convertir en booléen, on obtient '''true'''.
* la chaîne "false" est aussi une chaîne, mais ne peut pas être convertie en '''number'''. JavaScript, en dernier recours, convertit alors l'autre opérande en '''string''' et se retrouve à comparer "false"=="false", ce qui est vrai. Par contre, comme pour "0", la chaîne n'est pas vide et sa conversion en booléen donne '''true'''.
* le tableau vide [] est un tableau, donc JavaScript le convertit en chaîne pour le comparer à '''false'''. Or, la méthode toString() d'un tableau retourne la fusion de tous les éléments, séparés par des virgules. Comme il n'y a aucun élément dans le tableau, le résultat est la chaîne vide "", qui est équivalente à '''false'''. Par contre, un tableau est de type objet et sa conversion en booléen donne '''true'''.
 
Toutes les valeurs qui ne sont pas équivalentes à '''false''' sont équivalentes à '''true''' par comparaison, sauf encore une fois '''null''', '''NaN''' et '''undefined'''. Toutes les valeurs qui ne donnent pas '''false''' par conversion en '''boolean''' donnent '''true''', sans exception.
 
Attention, les valeurs de type '''object''', y compris les instances des classes '''String''', '''Number''' et '''Boolean''' créées avec le constructeur '''new''' sont toujours converties en '''true''', même lorsque leur valeur est "", 0 ou '''false''' (la seule exception est '''null''' qui est de type '''object''' et dont la conversion en booléen est '''false'''). Cependant la comparaison avec '''false''' fonctionne de la même façon qu'avec des valeurs littérales.
 
===object===