Je lisais un bon livre sur JavaScript.
Cela a commencé avec:
Le type booléen n'accepte que deux valeurs littérales: true et false. Celles-ci sont distinctes des valeurs numériques, donc true n'est pas égal à 1 et false n'est pas égal à 0.
Cependant, j'ai observé ce qui suit:
if(1==true)
document.write("oh!!! that's true"); //**this is displayed**
Je sais que chaque type en JavaScript a un équivalent booléen.
Mais alors, quelle est la vérité?
Il est vrai que true
et false
ne représentent aucune valeur numérique en Javascript.
Dans certaines langues (par exemple, C, VB), les valeurs booléennes sont définies comme des valeurs numériques réelles. Il s’agit donc de noms différents pour 1 et 0 (ou -1 et 0).
Dans d'autres langages (par exemple, Pascal, C #), il existe un type booléen distinct qui n'est pas numérique. Il est possible de convertir des valeurs booléennes en valeurs numériques, mais cela ne se produit pas automatiquement.
Javascript tombe dans la catégorie qui a un type booléen distinct, mais d'un autre côté, Javascript est assez enclin à convertir des valeurs entre différents types de données.
Par exemple, même si un nombre n'est pas un booléen, vous pouvez utiliser une valeur numérique dans laquelle une valeur booléenne est attendue. Utiliser if (1) {...}
fonctionne aussi bien que if (true) {...}
.
Lorsque vous comparez des valeurs, comme dans votre exemple, il existe une différence entre l'opérateur ==
et l'opérateur ===
. L'opérateur d'égalité ==
convertit avec bonheur les types pour trouver une correspondance. 1 == true
est donc évalué à true car true
est converti en 1
. L'opérateur d'égalité de types ===
ne fait pas de conversions de types, donc 1 === true
est évalué à false car les valeurs sont de types différents.
En JavaScript, == se prononce "Probablement égal".
Ce que je veux dire par là, c'est que JavaScript convertira automatiquement le booléen en entier, puis tentera de comparer les deux côtés.
Pour une égalité réelle, utilisez l'opérateur ===.
Essayez la comparaison d'égalité stricte:
if(1 === true)
document.write("oh!!! that's true"); //**this is not displayed**
L'opérateur ==
effectue la conversion d'un type à un autre, contrairement à l'opérateur ===
.
Extrait de la spécification ECMAScript, Section 11.9.3 Algorithme de comparaison d'égalité abstraite:
La comparaison x == y, où x et y sont des valeurs, produit true ou faux. Une telle comparaison est effectuée comme suit:
- Si Type (y) est booléen, renvoyez le résultat de la comparaison x == ToNumber (y).
Ainsi, dans, if (1 == true)
, true
est contraint à une Number
, c'est-à-dire Number(true)
, ce qui donne la valeur 1
, ce qui donne la dernière if (1 == 1)
qui est true
.
if (0 == false)
est exactement la même logique, puisque Number(false) == 0
.
Cela ne se produit pas lorsque vous utilisez plutôt l'opérateur __===
:
11.9.6 Algorithme de comparaison d'égalité stricte
La comparaison x === y, où x et y sont des valeurs, produit true ou faux. Une telle comparaison est effectuée comme suit:
- Si Type (x) est différent de Type (y), retournez false.
Ah, l'opérateur de comparaison lâche redouté frappe à nouveau. Ne l'utilisez jamais. Toujours utiliser la comparaison stricte, === ou! == à la place.
En bonus: 0 == ''
Quand comparer quelque chose avec Boolean cela fonctionne comme suit
Étape 1: Convertissez boolean
en Number
Number(true) // 1
et Number(false) // 0
Étape 2: Comparez les deux côtés
boolean == someting
-> Number(boolean) === someting
Si vous comparez 1
et 2
à true
, vous obtiendrez les résultats suivants
true == 1
-> Number(true) === 1
-> 1 === 1
-> true
Et
true == 2
-> Number(true) === 1
-> 1 === 2
-> false
En réalité, chaque objet javascript est résolu comme étant vrai s'il a "une valeur réelle" comme le dit W3Cschools. Cela signifie tout sauf ""
, NaN
, undefined
, null
ou 0
.
Tester un nombre contre un booléen avec l'opérateur ==
est en effet un peu bizarre, car le booléen est converti en 1 avant la comparaison, ce qui défie un peu la logique qui sous-tend la définition . comme ça:
var fred = !!3; // will set fred to true
var joe = !!0; // will set joe to false
alert("fred = "+ fred + ", joe = "+ joe);
tout n'est pas logique en javascript;)
Utilisez ===
pour assimiler les variables au lieu de ==
.
==
vérifie si la valeur des variables est similaire
===
vérifie si la valeur des variables et le type des variables sont similaires
Remarquez comment
if(0===false) {
document.write("oh!!! that's true");
}
et
if(0==false) {
document.write("oh!!! that's true");
}
donner des résultats différents
Well == est un opérateur de comparaison de blagues et en tant que développeurs js, nous ne devons pas utiliser == pour la comparaison. Toutes les questions de comparaison == ne sont pas valides pour commencer.