7
votes

JavaScript Type Casting

Considérez la matrice JavaScript vide:

var a = [];
alert(a == false); // shows true
alert(!a); // shows false!


5 commentaires

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 == , 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 ( == ), mais en règle générale, vous pouvez simplement l'éviter ( === ). Et puis, vous pouvez construire sur cette règle et ajouter des exceptions où vous voulez coercer.


Voir aussi: Stackoverflow.com/questions/24318654


5 Réponses :


12
votes

de http://forums.whirlpool.net.au/archive/966449 :

a == faux :

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 0 . Ensuite, il convertit l'objet en une "primitive", cédant la chaîne vide. Ensuite, il compare la chaîne vide à 0 . La chaîne vide est convertie en un numéro, cédant 0 , qui est numériquement égal au 0 sur le côté droit, le résultat de l'expression complète est donc vrai .

voir §11.9.3 de la spécific ECMAScript pour Tous les détails de Gory.

(! a) :

Dans ce cas, JavaScript convertit l'objet au Boolean True, puis invertit, entraînant de faux.


1 commentaires

Voici un lien direct vers la spécification ECMA mentionnée ci-dessus: ECMA -international.org/ecma-262/5.1/#ssec-11.9.3



8
votes

Le ! Opérateur vérifie si son opérande est "FALSY".

Les suivants sont VRAI:

  • ! false
  • ! 0
  • ! null
  • ! NAN
  • ! indéfini
  • ! ""

    Le == Opérateur vérifie l'égalité desserré, ce qui n'a rien à voir avec la fausseté.

    Plus précisément, A == B 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 et 1 .
    Les objets sont convertis en appelant la valeur , si défini.

    Ainsi, tous les éléments suivants sont VRAI:

    • "1" == 1
    • "0" == faux
    • "1" == vrai
    • "2"! = true
    • "2"! = FALSE
    • ({ValeurOf: fonction () {renvoie 2;}}) == 2
    • ({ValeurOf: fonction () {retour 1;}}) == True

3 commentaires

Comment sont ("2"! = Vrai), ("2"! = Faux) à la fois vrai?


@qwerty: de la même manière que 2! = 3 et 2! = 4 sont tous deux true


Oh parce que faux == numéro (0), true == numéro (1). Je l'ai Merci



1
votes

Lors de la comparaison d'un objet à une valeur primitive via l'opérateur == , l'objet se contraint à une valeur primitive elle-même (numéro ou chaîne). Dans ce cas [] contraintes dans 0 , puis false contraintes dans 0 : xxx

qui est vrai.

Le ! l'opérateur se contracte dans Boolean puis inversements la valeur. [] dans Boolean est vrai (comme avec n'importe quel objet). Ensuite, inversez-vous à devenir faux xxx


0 commentaires

5
votes

L'opérateur == code> Lorsque l'un des opérandes si booléen, tapez-la-convertit l'autre en nombre.

[].toString(); // ""

+""; // 0
Number(""); // 0


0 commentaires

0
votes

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:

tycast.js

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.


0 commentaires