Les opérateurs d'égalité
Il en existe 2:
- == pour les égalités non strictes, ces comparaisons provoque des abbérations liées au fait que JS se donne la possiblité de modifier le type d'une des variables pour évaluer la vraissemblance de l'égalité
- === pour les égalité strictes, dans ce cas le type et le contenu des variables sont comparés
Exemples d'abbérations
Démo
<h2>Comparaison avec ==</h2>
<script>
//1
console.log(0==false); //Affiche true
//2
console.log(5=="5"); //Affiche true
//3
console.log("true"==true); //Affiche false
</script>
Que se passe-t-il?
- avec == Javascript modifie le type de l'une ou l'autre partie du test avant d'effectuer le test d'égalité
- pour 0==false, JS modifie le type de 0 en boolean, et ensuite fait la comparaison false==false
- idem pour 5=="5", il y a modification du type de "5" pour avoir 5==5
- Par contre pour "true"==true, il n'y a pas de modification de type et on a bien false comme résultat
L'utilisation de == pour effectuer des comparaison d'égalité en JS est à proscrire car une action de modification (ou non!) d'une des deux parties de l'égalité tend à fournir des résultats incorrectes.
Exemples avec ===
Démo
<h2>Comparaison avec ===</h2>
<script>
//1
console.log(0===false); //Affiche false
//2
console.log(5==="5"); //Affiche false
//3
console.log("true"===true); //Affiche false
</script>
Il s'agit des même exemples que pour le précédent exemple, que se passe-t-il?
- contenu et type sont comparés entre les opérandes
L'utilisation de === pour effectuer des comparaison d'égalité en JS est sans surprise car contenu et type sont comprés entre les opérandes.
Comparaison entre types primitifs
L'opérateur=== (c'est vrai aussi pour ==) compare les valeurs des 2 opérandes
Démo
<h2>Comparaison d'égalité entre valeurs primitives>
<script>
var cours="Logique";
console.log(cours==="Logique"); //Affiche true
</script>
Comparaison entre types objets
L'opérateur=== (c'est vrai aussi pour ==) compare les références (ou adresses) des 2 opérandes
Démo
<h2>Comparaison d'égalité entre objets</h2>
<script>
var cours1, cours2;
cours1={nom:"logique"};
cours2=cours1;
console.log(cours1===cours2) //Affiche true
cours2.pgm="Un bien beau programme";
console.log(cours1===cours2) //Affiche encore true
//Contenus des objets cours1 et cours2
console.log(cours1.nom);
console.log(cours1.pgm);
console.log(cours2.nom);
console.log(cours2.pgm);
</script>
Même si on modifie l'objet cours2 en faisant cours2.pgm="pgm" la comparaison d'égalité renvoie true car on compare les références (ou adresses) des 2 opérandes