Considérez la matrice JavaScript vide:
var a = []; alert(a == false); // shows true alert(!a); // shows false!
5 Réponses :
de http://forums.whirlpool.net.au/archive/966449 : p>
Dans ce cas, le type de gauche est un objet, le type du côté droit est booléen. Javascript en premier convertit le booléen en un numéro, cédant voir §11.9.3 de la spécific ECMAScript pour Tous les détails de Gory. P>
Dans ce cas, JavaScript convertit l'objet au Boolean True, puis invertit, entraînant de faux. P> a == faux code>: strong> p>
0 code>. Ensuite, il convertit l'objet en une "primitive", cédant la chaîne vide. Ensuite, il compare la chaîne vide à
0 code>. La chaîne vide est convertie en un numéro, cédant
0 code>, qui est numériquement égal au
0 code> sur le côté droit, le résultat de l'expression complète est donc
vrai code>. p>
(! a) code>: strong> p>
Voici un lien direct vers la spécification ECMA mentionnée ci-dessus: ECMA -international.org/ecma-262/5.1/#ssec-11.9.3
Le Les suivants sont VRAI: P>
Le Plus précisément, Ainsi, tous les éléments suivants sont VRAI: P>
! code> Opérateur vérifie si son opérande est "FALSY". p>
! false code> li>
! 0 code> li>
! null code> li>
! NAN code> li>
! indéfini code> li>
! "" code> li>
ul>
== code> Opérateur vérifie l'égalité desserré, ce qui n'a rien à voir avec la fausseté. P>
A == B code> sera converti sur les opérandes en chiffres, puis comparez les numéros.
Les cordes contenant des chiffres se convertissent en chiffres qu'ils contiennent; booléans convertis en 0 code> et
1 code>.
Les objets sont convertis en appelant la valeur code>, si défini. P>
"1" == 1 code> li>
"0" == faux code> li>
"1" == vrai code> li>
"2"! = true code> li>
"2"! = FALSE code> LI>
({ValeurOf: fonction () {renvoie 2;}}) == 2 code> li>
({ValeurOf: fonction () {retour 1;}}) == True code> Li>
ul>
Comment sont ("2"! = Vrai), ("2"! = Faux) à la fois vrai?
@qwerty: de la même manière que 2! = 3 code> et
2! = 4 code> sont tous deux true
Oh parce que faux == numéro (0), true == numéro (1). Je l'ai Merci
Lors de la comparaison d'un objet à une valeur primitive via l'opérateur code> == code>, l'objet se contraint à une valeur primitive elle-même (numéro ou chaîne). Dans ce cas qui est vrai. p> Le [] code> contraintes dans
0 code>, puis
false code> contraintes dans
0 code>:
! code> l'opérateur se contracte dans Boolean puis inversements la valeur.
[] code> dans Boolean est
vrai code> (comme avec n'importe quel objet). Ensuite, inversez-vous à devenir
faux code> p>
L'opérateur == code> Lorsque l'un des opérandes si booléen, tapez-la-convertit l'autre en nombre.
[].toString(); // ""
+""; // 0
Number(""); // 0
Je ne sais pas si cela répond à la question, mais il y a une nouvelle bibliothèque pour se déplacer dans toutes les étranges bœufs de JavaScript: P>
tycast.js p>
dans une phrase, TypeCast résout tous les problèmes simples, vous pouvez donc vous concentrer sur les gros. TypeCast résout ce qui ne va pas avec JavaScript en créant une plate-forme complète pour des variables fortement typées dans JavaScript. Em> p>
Dupliqué possible de Pourquoi les alertes (!! " 0 ") et alerte (false ==" 0 ") Les deux rendement tristolet en JavaScript
Merci de pointer. Mais pas exactement, je demande des règles génériques.
En ce qui concerne l'opérateur lâche
== code>, les règles ne sont pas si génériques. Vous devriez lire via l'algorithme de comparaison d'égalité abstraite référencée par Cette réponse .
Ou, si vous voulez garder les choses simples, évitez tout à fait la contrainte de type. Il peut y avoir quelques bons cas d'utilisation pour la coercition (
== code>), mais en règle générale, vous pouvez simplement l'éviter (
=== code>). Et puis, vous pouvez construire sur cette règle et ajouter des exceptions où vous voulez coercer.
Voir aussi: B> Stackoverflow.com/questions/24318654