2010-11-18 9 views

Répondre

3

le pas de laisser passer vos exemples:

!!" " == true // => true 

Vous avez converti la chaîne "" en un booléen en l'annulant. Une chaîne de longueur différente de zéro sera évaluée à true lorsqu'elle sera convertie en booléen, donc l'annuler deux fois donnera la valeur booléenne true. true == true évidemment. Cet exemple n'aboutit pas à la conversion du deuxième paramètre en chaîne car l'opérateur unaire ! a une priorité supérieure à l'opérateur ==. Par conséquent, lorsque l'opérateur == est évalué, les deux opérandes sont du même type (booléen).

" " == true // => false 

Per documents Mozilla (section correspondante représentée sur la patrick dw's answer), les deux opérandes sont convertis en un nombre si l'opérande est un nombre ou une valeur booléenne. Vous vous retrouvez avec 0 == 1, ce qui est faux.

Dans ce cas, je crois que le deuxième paramètre est converti en une chaîne. Vous faites essentiellement " " == "true", ce qui est faux. C'est une comparaison de chaînes, pas une comparaison de chaîne et booléen.

if (" " == true){a = 1;} else {a = 0;} 

C'est le même que le précédent: l'un des opérandes est un booléen, afin que les deux valeurs sont converties en un nombre.

if (" "){b = 1;} else {b = 0;} 

Ceci est le même que le premier. La chaîne est contrainte dans une valeur booléenne. La chaîne a une longueur différente de zéro, donc elle retourne vrai.

+0

Oooh ok: "Selon les docs Mozilla, les deux opérandes sont convertis en nombre si l'un ou l'autre est un nombre ou un booléen." Cela explique tout. Merci ! – glmxndr

+0

Jonathon - Juste une note amicale pour référence future. Si vous empruntez des informations d'une autre réponse (si elle vient effectivement de la mienne) ou de toute autre source, c'est une bonne idée d'en donner la confirmation dans votre réponse. ; o) – user113716

+0

@patrick dw - excuses, j'essaie d'être consciencieux à ce sujet. J'avais jeté un coup d'œil sur les documents de Mozilla et votre réponse m'a renvoyé à la section que j'avais besoin de lire de plus près. –

0

La chaîne de longueur est égale à la valeur true. L'évaluation de chaîne à Boolean est fausse car ce ne sont pas les mêmes types de données. Le double !! est une utilisation non-fausse opération.

Alors vous dites:

"" == false -> false == false -> true == true

Répartition:

(!(!" ") == true) 
(!(false) == true) 
(true == true) 
(true) 
2

De section 9.3.1 dans ECMAScript 5, en ce qui concerne la conversion de chaînes de chiffres:

A StringNumericLiteral qui est vide ou ne contient que l'espace blanc est converti en 0.

Et from MDC docs:

Si les deux opérandes ne sont pas du même type, JavaScript convertit les opérandes puis applique la stricte comparaison.Si l'un ou l'autre opérande est un nombre ou un booléen, les opérandes sont convertis en nombres si possible; sinon, si l'un ou l'autre opérande est une chaîne, l'autre opérande est converti en une chaîne si possible.

Ainsi, étant donné que la chaîne est comparée à une valeur booléenne, une tentative est faite pour la convertir en nombre. Et comme une chaîne vide ou une chaîne contenant uniquement des espaces blancs est convertie en 0, cela serait considéré comme faux.

" " == false; // true 
" " == 0;  // true 
"false" == false; // false because "false" can't be converted to a number 

Alors, quand vous faites:

!!" " 

Vous n'êtes plus compter sur la == pour faire des conversions pour vous. Au lieu de cela, vous le convertissez manuellement en utilisant vos propres critères, qui est de ne pas le convertir en un nombre, mais plutôt de le convertir en un booléen avant que le == ait lieu. Donc, vous faites true == true ou probablement 1 == 1.

Pour voir la chaîne avec seulement un espace blanc converti en un nombre, utilisez l'opérateur + unaire comme ceci:

alert(+" "); // alerts 0 
+0

Woops, ajusté ma réponse. Avait la chaîne comparée à booléenne mal. –