250 votes

En Javascript, pourquoi "0" est-il égal à false, mais pas à lui seul?

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
 

378voto

Joe Points 34413

Les Tables de l'affichage de la question:

truthy if statement

et == truthy comparisons of all object types in javascript

Morale de l'histoire d'utilisation === strict equality displaying sanity

génération de table de crédit: https://github.com/dorey/JavaScript-Equality-Table

270voto

jdi Points 38029

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)

39voto

Incognito Points 10637

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:

enter image description here

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é)

15voto

kzh Points 5098

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).

13voto

bobince Points 270740

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.com

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.

Powered by:

X