Lorsque j'utilise l'une des valeurs (null
, undefined
, false
, ''
, 0
) dans une instruction if
, elle est toujours évaluée comme une erreur (false
). De plus, la négation de ces valeurs ((null
, undefined
, false
, ''
, 0
) dans une instruction if
toujours évaluée comme tautologie (true
).
if(null){
}else{
}
if(undefined){
}else{
}
if(false){
}else{
}
if(''){
}else{
}
if(0){
}else{
}
Dans tous les cas ci-dessus, l'instruction if
est évaluée lors de l'exécution de l'instruction false
& else
. Cependant, lorsque je compare ces valeurs de sophisme avec ==
, il ne renvoie pas toujours true
. Étonnamment, il renvoie toujours des valeurs de true
lorsque je compare la négation de ces valeurs.
si double égal à (==
) l'opérateur vérifie/compare les valeurs et pas strictement les types, alors pourquoi:
null == false // returns false
null == 0 // returns false
null == '' // returns false
Mais,
!null == !false // returns true
!null == !0 // returns true
!false == !undefined // returns true
Et,
null == undefined // returns true
false == 0 // returns true
J'apprécie si quelqu'un peut clarifier le comportement ou la relation entre ces valeurs (null
, undefined
, false
, ''
, 0
).
"... Si double égal à (
==
) l'opérateur vérifie/compare uniquement les valeurs et non les types ... "
C'est une hypothèse incorrecte, bien qu'elle soit souvent répétée par les gens. En réalité, le ==
vérifie les types et, en fait, accorde beaucoup plus d'attention aux types qu'un ===
la comparaison le fait.
Voir Algorithme de comparaison d'égalité abstraite.
UNE ==
la comparaison ne fait pas une conversion simple en booléen . Il parcourt plutôt un algorithme récursif quelque peu complexe qui, après avoir vérifié les types, tente de contraindre les opérandes au même type s'ils ne correspondent pas.
La contrainte de type qu'il effectue est très spécifique aux types d'opérandes. Une séquence différente de coercitions peut avoir lieu pour différentes paires de types. Habituellement (mais pas toujours), cela finit par contraindre les opérandes aux types number
.
!
si les opérandes changent les chosesLorsque vous contraignez manuellement les deux opérandes à l'aide de !
, vous faites maintenant une conversion simple toBoolean provoquant la correspondance des types, ce qui évite la partie coercitive de type de l'algorithme, ce qui le fait se comporter essentiellement comme le Algorithme de comparaison stricte d'égalité.
Donc, la seule façon de prédire le résultat d'un ==
la comparaison lorsque les types ne correspondent pas consiste à comprendre cet algorithme abstrait.
NaN
Et pour info, il y a une autre valeur "falsey" à considérer, NaN
. Son ==
la comparaison sera toujours false
, quoi qu'il arrive. Même en comparant à une autre valeur NaN
, ce sera false
.
undefined
: signifie qu'une variable a été déclarée mais n'a pas de valeur assignée
null
: la valeur de null a été affectée, ce qui signifie qu'elle n'a pas de valeur
false
, ''
et 0
Je pense que vous pouvez probablement comprendre ce que cela signifie.
NULL est différent de false (NULL est de type objet et false est de type booléen), null est différent de 0 (0 est de type entier), null est également différent de '' ('' est de type chaîne). mais ce sont toutes des valeurs fausses. Le ! L'opérateur annule une valeur booléenne. Si ! est utilisé sur les valeurs de falsification, il résulte de la conversion des valeurs de falsification en un objet de type booléen.