Ce qui suit montre que "0"
est faux en Javascript:
>>> "0" == false
true
>>> false == "0"
true
Alors, pourquoi est-ce que l'impression suivante est "ha"
?
>>> if ("0") console.log("ha")
ha
Ce qui suit montre que "0"
est faux en Javascript:
>>> "0" == false
true
>>> false == "0"
true
Alors, pourquoi est-ce que l'impression suivante est "ha"
?
>>> if ("0") console.log("ha")
ha
Les Tables de l'affichage de la question:
et ==
Morale de l'histoire d'utilisation ===
génération de table de crédit: https://github.com/dorey/JavaScript-Equality-Table
La raison en est que lorsque vous avez explicitement n' "0" == false
, les deux côtés sont convertis en nombres, et la comparaison est effectuée.
Lorsque vous faites: if ("0") console.log("ha")
, la valeur de la chaîne est en train d'être testé. Toute chaîne non vide est vraie, alors une chaîne vide est fausse.
L'égalité (==)
Si les deux opérandes sont pas du même type, JavaScript convertit l'opérande applique ensuite une comparaison stricte. Si l'un des deux opérandes est un nombre ou une valeur de type boolean, les opérandes sont convertis en nombres si possible; sinon, si l'un des deux opérandes est une chaîne, l'autre opérande est converti en une chaîne de caractères si possible. Si les deux opérandes sont des objets, puis JavaScript compare les références internes qui sont égales lorsque les opérandes de se référer au même objet en mémoire.
(À partir des Opérateurs de Comparaison dans Mozilla Developer Network)
C'est selon les spécifications.
12.5 si L'Instruction ..... 2. Si ToBoolean(GetValue(exprRef)) est vrai, alors un. Retourner le résultat de l'évaluation de la première Instruction. 3. Autre chose, ....
ToBoolean, selon la spécification, est
Le résumé de l'opération ToBoolean convertit son argument à une valeur de type Boolean selon le Tableau 11:
Et cette table, dit ceci à propos des chaînes:
Le résultat est faux si l'argument est une Chaîne de caractères vide (sa longueur est égale à zéro); sinon, le résultat est vrai
Maintenant, pour expliquer pourquoi, "0" == false
vous devriez lire l'opérateur d'égalité, qui stipule qu'il reçoit sa valeur de l'abrégé de l'opération GetValue(lref)
correspond à la même chose pour le côté droit.
Qui décrit cette partie pertinente:
si IsPropertyReference(V), alors un. Si HasPrimitiveBase(V) est faux, alors laissez-vous être le [[]] méthode interne de la base, sinon laisser spécial [[]] interne de la méthode définie ci-dessous. b. Retourner le résultat de l'appel d'obtenir la méthode interne à l'aide de la base de sa valeur, et en passant GetReferencedName(V) pour l'argument
Ou en d'autres termes, une chaîne a une primitive de base, ce qui appelle de nouveau interne la méthode get et se termine à la recherche de faux.
Si vous souhaitez évaluer les choses à l'aide de la GetValue utilisation ==
,, si vous voulez évaluer à l'aide de l' ToBoolean
, utilisez ===
(aussi connu comme la "stricte" opérateur d'égalité)
Lors de l'exécution d'un if
déclaration, le paramètre est converti en une valeur de type Boolean primitive, essentiellement comme suit:
!!0
//-> false
!!"0"
//-> true
0
est un Nombre, alors qu' "0"
est une Chaîne de caractères. Chaînes de caractères de longueur quelconque, sauf pour la longueur de la 0
sont truthy valeurs, c'est à dire toutes les chaînes sont truthy sauf pour la chaîne vide. dans ce cas - "0" !== 0
. Tous les numéros sont en JavaScript truthy sauf pour 0
et NaN
.
"0" == false
tourne les deux opérandes dans les numéros, tout comme "3" == 3
(il retourne true
).
C'est PHP où la chaîne "0"
est falsy (faux-quand-utilisé-en-boolean-contexte). En JavaScript, toutes les chaînes non-vides sont truthy.
Le truc, c'est qu' ==
contre une valeur de type boolean n'est pas évalué dans un contexte booléen, il convertit en nombre, et, dans le cas de chaînes qui est fait par l'analyse qu'en décimal. Ainsi, vous obtenez le Nombre 0
au lieu de le truthiness boolean true
.
C'est vraiment un très pauvres peu de la langue de conception et c'est l'une des raisons pour lesquelles nous essayons de ne pas utiliser la malheureuse ==
de l'opérateur. Utiliser ===
à la place.
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.