6
votes

En utilisant typeof vs === pour vérifier la variable non déclarée produit un résultat différent

Si j'ai une variable non déclarée et utilisez typeof il me dit que c'est non défini . Mais si je vérifie alors cela en utilisant si (qweasdasd === non défini) il jette une exception.

Je ne comprends pas ce comportement, car si le premier indique non défini , alors la deuxième vérification doit être évaluée à si (indéfini === non défini) , pourquoi Il jette une exception de référenceError?


5 commentaires

Impossible de reproduire: jsfiddle.net/y1xhw9un


@Jamiec - peut reproduire: jsfiddle.net/y1xhw9un/1


@Quentin - ahh, c'est non déclaré , quand il est indéfini, il fonctionne, alors il fonctionne Jsfiddle. NET / Y1XHW9UN / 2


@Jamiec: Dans cet extrait, vous êtes défini sur cette extrémité Y pour avoir une valeur non définie . OP est posé sur un cas lorsque la variable est indéfinie, pas quand il a une valeur non définie . "non déclaré" n'existe pas comme terme en JavaScript; Le message d'erreur est "RéférenceErrorror: ... n'est pas défini".


@AMADAN - Non, il apparaît (de l'échantillon de quentins) L'OP a une variable non déclarée - c'est très différent de non défini. Je pense que votre réponse est la bonne thogh - typeof vous permet de "sortir avec elle" où la vérification de l'égalité n'est pas.


6 Réponses :


1
votes

essayer de lire la valeur d'une variable non déclarée (que vous devez faire avant de pouvoir comparer cette valeur à la valeur de non défini ) jette une référence.

Application du type de type de à une variable non déclarée ne le fait pas.


1 commentaires

Pourquoi typeof se comporte-t-il différemment de, par exemple, unary (E.G. + foo -> boom! )?



7
votes

typeof ressemble à un appel de la fonction, mais ce n'est pas - c'est un opérateur. Les opérateurs sont autorisés à casser des règles. typeof (qweasdasd) n'assume pas qweasdasd existe; Que ce soit ou non et que c'est ce que c'est ce que typeof existe à découvrir. Cependant, lorsque vous testez qweasdasd === non définis , vous utilisez qweasdasd comme valeur, et JS se plaint lorsque vous utilisez une variable que vous n'avez pas affecté une valeur à .


6 commentaires

Mais n'est-ce pas un mensonge de dire que qweasdasd est un non défini ? Parce que dans mon esprit, le chèque si est parfaitement valide et doit évaluer à si (indéfini === non défini) .


JavaScript est un peu déroutant ici (et ce n'est pas le seul endroit; ne me fais pas commencer sur la folie de trier ). Comme je l'ai dit, être indéfini et avoir la valeur non définie est deux choses différentes, une situation malheureuse exacerbée par le fait que typeof (qweasdasd) et typeof (non défini) les deux produisent le même résultat.


Parfois, il vous suffit d'abandonner la compréhension de la logique de JavaScript.


Pourquoi typeof se comporte-t-il différemment de, par exemple, unary + ?


La logique? C'était une langue créée en 10 jours, qui a atterri un monopole sur l'environnement du navigateur, qui s'est terminé de geler les modifications incompatibles. Je suis stupénée C'est une forme aussi bonne que c'est.


@Salmana: Comme je l'ai dit, les opérateurs peuvent rupture de règles. && et || rupture de rupture par paresseusement décidant ou non d'évaluer le deuxième argument; typeof rompt les règles en ne priant pas si une variable a été définie ou non. + a été créé pour évaluer les deux arguments et également se soucier de la variable définie. Il ne casse pas de règles; Personne n'a déclaré que tous les opérateurs doivent être bizarres.



0
votes

Vous avez une variable non définie, mais pas une valeur d'objet non définie. xxx


0 commentaires

0
votes

essayer d'accéder à une variable non définie dans JavaScript donne RéférenceError . typeof fonctionne car il n'accède pas à une valeur variable. Sa vérification de son type.

typeof ne nécessite pas une variable définie. Son paramètre doit être une expression représentant l'objet ou la primitive dont le type doit être retourné.


0 commentaires

0
votes

1 commentaires

typeof (parseint) : "fonction" . Mais typeof (typeof) : syntaxError . typeof est pas une fonction ; Si cela était une fonction, il donnerait RéférenceError comme parseint (qweasdasd) fait.



1
votes

Je pense avoir une explication très simple pour cela - car les spécifications le disent:


0 commentaires