Récemment, j'exécutais une partie de mon code via JSLint lorsque j'ai rencontré cette erreur. La chose que je trouve amusante à propos de cette erreur, c'est qu'elle suppose automatiquement que tout == doit être ===.
Cela a-t-il vraiment un sens? Je pourrais voir un grand nombre de cas où vous ne voudriez pas comparer le type, et je crains que cela puisse causer des problèmes.
Le mot «prévu» impliquerait que cela devrait être fait CHAQUE fois ..... C'est ce qui n'a pas de sens pour moi.
javascript
jslint
Métropole
la source
la source
myVar == null
vérification, oui, de grands changements. ; ^) L'argument de Crockford est qu'il a rendu le sens du code plus précis, et c'est difficile à argumenter.Réponses:
IMO, utiliser aveuglément
===
, sans essayer de comprendre comment fonctionne la conversion de type n'a pas beaucoup de sens.La principale crainte à propos de l'opérateur Equals
==
est que les règles de comparaison en fonction des types comparés peuvent rendre l'opérateur non transitif, par exemple, si:Ne garantit pas vraiment que:
Par exemple:
'0' == 0; // true 0 == ''; // true '0' == ''; // false
L'opérateur Strict Equals
===
n'est pas vraiment nécessaire lorsque vous comparez des valeurs du même type, l'exemple le plus courant:if (typeof foo == "function") { //.. }
Nous comparons le résultat de l'
typeof
opérateur, qui est toujours une chaîne , avec une chaîne littérale ...Ou lorsque vous connaissez les règles de coercition de type, par exemple, vérifiez si quelque chose est
null
ouundefined
quelque chose:if (foo == null) { // foo is null or undefined } // Vs. the following non-sense version: if (foo === null || typeof foo === "undefined") { // foo is null or undefined }
la source
===
opérateur est la clarté du code. Il n'y a pas de situation raisonnable à utiliser==
car elle ne sera jamais aussi claire et compréhensible que l'opérateur d'identité. Il ne s'agit pas de savoir si vous comprenez les opérateurs ou non, il s'agit d'utiliser celui qui rend votre code plus facilement lisible presque sans frais. Les seuls développeurs qui s'opposent à l'opérateur d'identité sont les développeurs solo et les personnes qui ne travaillent pas en équipe. Par définition, les gens dont le code n'est pas examiné par suffisamment d'yeux.there is no reasonable situation
une inexactitude flagrante. Pensez aux types Javascript (natifs)Number
etString
. Leur existence prouve que les auteurs de Javascript avaient en tête certains cas d'utilisation==
. Pensez-vous vraimentnew String('hi') === 'hi'
qu'évaluerfalse
est très clair? Veuillez écrire un extrait de code qui teste votre argument de fonction contre l''hi'
acceptation à la fois de String et de string et dites-moi que c'est clair.JSLint est intrinsèquement plus défensif que ne le permet la syntaxe Javascript.
À partir de la documentation JSLint:
la source
==
opérateur. Le===
est un cas particulier ... JSLint essaie de faire croire que l' utilisation==
serait en quelque sorte tort ... Cependant, essayez ceci:var x = 4, y = new Number(4); if (x == y) {alert('Javascript depends on == just embrace it!');}
. Les types primitifs ont des classes correspondantes qui les remplacent (Number
,String
) et Javascript dépend de l'==
opérateur pour rendre la comparaison naturelle.Gardez à l'esprit que JSLint applique une idée de ce que devrait être un bon JavaScript. Vous devez toujours faire preuve de bon sens lors de la mise en œuvre des changements qu'il suggère.
En général, comparer le type et la valeur rendra votre code plus sûr (vous ne rencontrerez pas de comportement inattendu lorsque la conversion de type ne fait pas ce que vous pensez qu'elle devrait).
la source
Triple-égal est différent de double-égal car en plus de vérifier si les deux côtés ont la même valeur, triple-égal vérifie également qu'ils sont du même type de données.
C'est
("4" == 4)
vrai, alors que("4" === 4)
c'est faux.Triple-égal s'exécute également un peu plus rapidement, car JavaScript n'a pas à perdre de temps à effectuer des conversions de type avant de vous donner la réponse.
JSLint vise délibérément à rendre votre code JavaScript aussi strict que possible, dans le but de réduire les bogues obscurs. Il met en évidence ce genre de chose pour essayer de vous amener à coder d'une manière qui vous oblige à respecter les types de données.
Mais la bonne chose à propos de JSLint est que ce n'est qu'un guide. Comme on dit sur le site, cela vous blessera, même si vous êtes un très bon programmeur JavaScript. Mais vous ne devriez pas vous sentir obligé de suivre ses conseils. Si vous avez lu ce qu'il a à dire et que vous le comprenez, mais que vous êtes sûr que votre code ne se cassera pas, alors vous n'êtes pas obligé de changer quoi que ce soit.
Vous pouvez même dire à JSLint d'ignorer les catégories de vérifications si vous ne voulez pas être bombardé d'avertissements contre lesquels vous n'allez rien faire.
la source
Une citation de http://javascript.crockford.com/code.html :
JSLint est très strict, leur 'webjslint.js' ne passe même pas leur propre validation.
la source
webjslint.js
non-validation - bien que la plupart des erreurs que je vois actuellement soient liées à l'espacement. De toute évidence, il faut faire preuve de bon sens et de jugement raisonnable lors de l'examen de JavaScript en utilisant JSLint.always
disqualifie automatiquement cette citation en tant que sagesse. Les programmeurs intelligents ne sont pas dogmatiques. Ils utilisent ce qu'il y a de mieux dans la situation donnée. Et ils accueillent et adoptent tout outil intégré au cœur même du langage, pas seulement le rejeter avec unjust never touch it
. Bottom line: Mon code est plus court (et pas seulement en sauvegardant un=
caractère), donc mon site se charge plus rapidement, à moindre coût en bande passante, donc mon utilisateur est mieux servi.Si vous voulez tester la fausseté. JSLint ne permet pas
if (foo == null)
mais permet
if (!foo)
la source
===
, ce que JSLint recommande.foo == null
recherche null ou indéfini.!foo
vérifie les chaînes nulles, indéfinies, 0 et vides.Pour aider à expliquer cette question et également expliquer pourquoi NetBeans (à partir de) 7.3 a commencé à afficher cet avertissement, ceci est un extrait de la réponse sur le suivi des bogues NetBeans lorsque quelqu'un a signalé cela comme un bogue:
Il est recommandé d'utiliser === plutôt que == en JavaScript.
Référence
la source
Eh bien, cela ne peut pas vraiment causer de problèmes, c'est juste vous donner des conseils. À prendre ou a laisser. Cela dit, je ne sais pas à quel point c'est intelligent. Il peut bien y avoir des contextes dans lesquels cela ne le présente pas comme un problème.
la source