Ce qui suit "0"
est faux en Javascript:
>>> "0" == false
true
>>> false == "0"
true
Alors, pourquoi le texte suivant s'imprime- "ha"
t-il?
>>> if ("0") console.log("ha")
ha
javascript
boolean
non-polarité
la source
la source
"0"
est une chaîne, et comme elle n'est pas vide, elle est évaluée à true."0" === false [...] false
'0'==false
mais '0' n'est pas une valeur de falsey (oui Javascript peut être bizarre)==
, elles ne sont jamais converties en booléens, donc cela ne s'applique pas. (Les règles de conversion semblent favoriser la conversion en nombres.)Réponses:
La raison en est que lorsque vous le faites explicitement
"0" == false
, les deux côtés sont convertis en nombres, puis la comparaison est effectuée.Lorsque vous effectuez
if ("0") console.log("ha")
:, la valeur de chaîne est testée. Toute chaîne non vide l'esttrue
, tandis qu'une chaîne vide l'estfalse
.la source
Tableaux affichant le problème:
et ==
Morale de l'utilisation de l'histoire ===
crédit de génération de table: https://github.com/dorey/JavaScript-Equality-Table
la source
NaN
bien. Je veux dire,typeof NaN // number
maisNaN === NaN // false
, hmm ...NaN
, donc quand vous comparez 2 NaN, elles sont de valeurs différentes (je suppose). Lisez la première citation ici .==
ni===
opérateur pour la[]
,{}
,[[]]
,[0]
et les[1]
valeurs n'évaluent pas vrai. Je veux dire[] == []
et[] === []
aussi faux.C'est selon les spécifications.
ToBoolean, selon la spécification, est
Et ce tableau dit ceci à propos des chaînes:
Maintenant, pour expliquer pourquoi
"0" == false
vous devriez lire l'opérateur d'égalité, qui indique qu'il obtient sa valeur de l'opération abstraiteGetValue(lref)
correspond de même pour le côté droit.Qui décrit cette partie pertinente comme:
Ou en d'autres termes, une chaîne a une base primitive, qui rappelle la méthode interne get et finit par sembler fausse.
Si vous souhaitez évaluer des choses à l'aide de l'opération GetValue
==
, si vous souhaitez évaluer à l'aide deToBoolean
, utilisez===
(également appelé opérateur d'égalité "strict")la source
"a string has a primitive base, which calls back the internal get method and ends up looking false"
Est-ce vrai pour toutes les chaînes?Section 8.12.3: [[Get]] (P)
décrit comment cela fonctionne. Ce n'est vrai que pour les cas où la chaîne est 0, car il fait un tas d'autres appels internes qui aboutissent finalement àGetOwnProperty
ce que "quoi que ce soit" est une propriété de données, qui retourne ensuite complètement cette valeur. C'est pourquoi "0" est faux et "bla" est vrai. Découvrez quelques-unes des vidéos de Douglas Crockford sur Yahoo Developer Theatre, il décrit la "vérité" en JavaScript un peu moins complexe que moi. Si vous comprenez ce que signifie «véridique» et «fausse», vous comprendrez immédiatement la réponse de Bobince.C'est PHP où la chaîne
"0"
est fausse (false-when-used-in-boolean-context). En JavaScript, toutes les chaînes non vides sont véridiques.L'astuce est que
==
contre un booléen n'évalue pas dans un contexte booléen, il se convertit en nombre, et dans le cas des chaînes, cela se fait en analysant en décimal. Vous obtenez donc Number0
au lieu de la vérité booléennetrue
.Il s'agit d'une conception de langage vraiment médiocre et c'est l'une des raisons pour lesquelles nous essayons de ne pas utiliser l'
==
opérateur malheureux . Utilisez===
plutôt.la source
la source
Vos guillemets autour de la
0
font une chaîne, qui est évaluée comme vraie.Supprimez les guillemets et cela devrait fonctionner.
la source
Tout cela est dû aux spécifications ECMA ... en
"0" == false
raison des règles spécifiées ici http://ecma262-5.com/ELS5_HTML.htm#Section_11.9.3 ... Et estif ('0')
évalué à vrai en raison des règles spécifiées ici http: / /ecma262-5.com/ELS5_HTML.htm#Section_12.5la source
L'expression "si" teste la véracité, tandis que la double égalité teste l'équivalence indépendante du type. Une chaîne est toujours véridique, comme d'autres l'ont souligné ici. Si le double égal testait la véracité de ses deux opérandes et comparait ensuite les résultats, alors vous obtiendriez le résultat que vous supposiez intuitivement, c'est-à-dire
("0" == true) === true
. Comme le dit Doug Crockford dans son excellent JavaScript: les bonnes parties , "les règles par lesquelles [== contraint les types de ses opérandes] sont compliquées et immémoriales ... Le manque de transitivité est alarmant". Il suffit de dire que l'un des opérandes est soumis à une contrainte de type pour correspondre à l'autre, et que "0" finit par être interprété comme un zéro numérique,la source
== L'opérateur d'égalité évalue les arguments après les avoir convertis en nombres. Ainsi, la chaîne zéro "0" est convertie en type de données Number et la valeur booléenne false est convertie en Number 0. Donc
Il en va de même pour `
=== Le contrôle d'égalité strict évalue les arguments avec le type de données d'origine
Il en va de même pour
Dans
La chaîne «0» ne se compare à aucun argument et la chaîne est une valeur vraie jusqu'à ce qu'elle soit comparée à un argument ou à moins qu'elle ne soit comparée. C'est exactement comme
Mais
"
la source
En effet, JavaScript utilise la contrainte de type dans les contextes booléens et votre code
sera contraint à true dans les contextes booléens.
Il existe d'autres valeurs véridiques dans Javascript qui seront forcées à true dans des contextes booléens, et ainsi exécuter le bloc if sont: -
la source
force x à utiliser le toBoolean interne de JavaScript (http://es5.github.com/#x9.2)
contraint les deux côtés en utilisant la contrainte interne toNumber (http://es5.github.com/#x9.3) ou toPrimitive pour les objets (http://es5.github.com/#x9.1)
Pour plus de détails, voir http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/
la source