Comment utiliser l'opérateur existentiel CoffeeScript pour vérifier certaines propriétés d'objet pour undefined?
Je voudrais utiliser la CoffeeScript existentielle de l'opérateur de vérifier certaines propriétés de l'objet pour non-défini. Cependant, j'ai rencontré un petit problème.
Code comme ceci:
console.log test if test?
Compile:
if (typeof test !== "undefined" && test !== null) console.log(test);
Ce qui est le comportement que je voudrais voir. Cependant, lorsque j'essaie de l'utiliser sur les propriétés de l'objet, comme ceci:
console.log test.test if test.test?
J'obtiens quelque chose comme ça:
if (test.test != null) console.log(test.test);
Qui desn ressemble pas à une contre-vérifier les undefined. La seule façon que je pouvais avoir atteint le même (1:1) le comportement que l'utiliser pour des objets en utilisant un plus grand contrôle:
console.log test.test if typeof test.test != "undefined" and test.test != null
La question est - ce que je fais quelque chose de mal? Ou est le code compilé ce qui est suffisant pour vérifier l'existence d'une propriété (null vérifier avec la conversion de type)?
source d'informationauteur Przemek
Vous devez vous connecter pour publier un commentaire.
C'est un point commun de confusion avec l'opérateur existentiel: Parfois
compile de
et d'autres fois il vient de compile pour
Les deux sont équivalents, parce que
x != null
serafalse
quandx
est soitnull
ouundefined
. Doncx != null
est une façon plus compacte d'exprimer(x !== undefined && x !== null)
. La raison pour laquelle letypeof
de compilation se produit est que le compilateurx
peut ne pas avoir été du tout défini, dans ce cas de faire un test d'égalité déclencheraitReferenceError: x is not defined
.Dans votre cas particulier,
test.test
peut avoir la valeurundefined
mais vous ne pouvez pas obtenir unReferenceError
en se référant à une propriété non définie sur un objet existant, de sorte que le compilateur opte pour la plus courte sortie.Ce JavaScript:
en fait de vérifier si le
foo
propriété dea
est niundefined
ninull
. Notez quea.foo?
est traduit en JavaScript qui utilise!= null
plutôt que!== null
. Les conversions qui!=
ne signifie que ces deux sont remplies:Une plaine
a?
devient ce JavaScript:parce qu'il y a trois conditions à vérifier:
a
à la portée de n'importe où?a
ont une valeur deundefined
?a
ont une valeur denull
?La première condition est important que de simplement dire
a != null
sera le déclencheur d'une ReferenceError si il n'y a pas dea
portée mais en disanttypeof a === 'undefined'
ne sera pas. Letypeof
vérifier s'occupe aussi de l'a === undefined
condition dans 2. Ensuite, nous peut-il finir avec une strictea !== null
test qui prend soin de 3 sans dégradation des performances de l'inutile!=
(note:!=
et==
sont plus lents que les!==
et===
en raison de la conversion implicite).Un peu de lecture sur ce
!=
et!==
ne peut être fructueuse:Aussi loin que votre commentaire sur le supprimé réponse,
if(a.foo)
est parfaitement valide la syntaxe si vous remplissez leif
déclaration:Cependant,
if(a.foo)
etif(a.foo?)
diffèrent dans la façon dont ils gèrent0
false
et''
.Sauvage deviner; avez-vous essayé
console.log test.test if test?.test?
?Juste testé avec
coffee -p -e 'console.log test.test if test?.test?'
qui compile: