J'utilise JSLint pour passer par JavaScript, et il renvoie de nombreuses suggestions à remplacer ==
(deux signes égaux) par ===
(trois signes égaux) lorsque vous faites des choses comme comparer à l' idSele_UNVEHtype.value.length == 0
intérieur d'une if
déclaration.
Y a-t-il un avantage de performance à remplacer ==
par ===
?
Toute amélioration des performances serait la bienvenue car il existe de nombreux opérateurs de comparaison.
Si aucune conversion de type n'a lieu, y aurait-il un gain de performances par rapport à ==
?
=== vs ==
, mais en PHP, peut lire ici: stackoverflow.com/questions/2401478/why-is-faster-than-in-php/…===
c'est bien plus rapide que==
. jsperf.com/comparison-of-comparisons===
over==
. En fait, le benchmark ne montre pas de grande différence entre les deux sur les navigateurs modernes. Personnellement, j'utilise généralement==
partout sauf si j'ai vraiment besoin d'une stricte égalité.===
et==
: youtube.com/… Si cela ne joue pas, c'est à 15h20Réponses:
L'opérateur d'égalité stricte (
===
) se comporte de manière identique à l'opérateur d'égalité abstraite (==
) sauf qu'aucune conversion de type n'est effectuée et que les types doivent être identiques pour être considérés comme égaux.Référence: Tutoriel Javascript: Opérateurs de comparaison
L'
==
opérateur comparera pour l'égalité après avoir effectué toutes les conversions de type nécessaires . L'===
opérateur ne fera pas la conversion, donc si deux valeurs ne sont pas du même type===
, il retournera simplementfalse
. Les deux sont tout aussi rapides.Pour citer l'excellent JavaScript de Douglas Crockford : The Good Parts ,
Mise à jour:
Un bon point a été soulevé par @Casebash dans les commentaires et dans la réponse de @Phillipe Laybaert concernant les objets. Pour les objets,
==
et===
agissez de manière cohérente les uns avec les autres (sauf dans un cas particulier).Le cas spécial est lorsque vous comparez une primitive avec un objet qui est évalué à la même primitive, en raison de sa méthode
toString
ouvalueOf
. Par exemple, considérons la comparaison d'une primitive de chaîne avec un objet chaîne créé à l'aide duString
constructeur.Ici, l'
==
opérateur vérifie les valeurs des deux objets et retournetrue
, mais le===
voit qu'ils ne sont pas du même type et revientfalse
. Laquelle est correcte? Cela dépend vraiment de ce que vous essayez de comparer. Mon conseil est de contourner complètement la question et de ne pas utiliser leString
constructeur pour créer des objets chaîne à partir de littéraux chaîne.Référence
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
la source
Utilisation de l'
==
opérateur ( égalité )Utilisation de l'
===
opérateur ( identité )En effet, l' opérateur d'égalité saisit la
==
contrainte , ce qui signifie que l'interpréteur essaie implicitement de convertir les valeurs avant de comparer.D'un autre côté, l' opérateur d'identité
===
ne fait pas de coercition de type , et donc ne convertit pas les valeurs lors de la comparaison, et est donc plus rapide (comme selon ce test de référence JS ) car il saute une étape.la source
==
«égalité abstraite» et il appelle===
«égalité stricte». Certes, appeler==
toute sorte d '"égalité" est à mon humble avis, car il n'est pas transitif, mais pourquoi chicaner? Je prends plus de problème avec "l'identité" cependant; Je pense que ce terme est assez trompeur, bien qu'il "fonctionne". Mais sérieusement, qui a inventé le terme «identité»? Je recherche la norme et je ne la trouve pas.Une représentation picturale intéressante de la comparaison d'égalité entre
==
et===
.Source: http://dorey.github.io/JavaScript-Equality-Table/
var1 === var2
var1 == var2
la source
x == null
pour vérifier six
estnull
ouundefined
.==
vs===
. Les majuscules et les minuscules sont de toute façon inégales et reviendrontfalse
avec les opérateurs==
et===
. En outre, des mots - cléstrue
,false
,undefined
,null
,Infinity
existent dans JS dans un seul cas, et ne peuvent pas être utilisés dans les cas supérieurs ou mixtes.Dans les réponses ici, je n'ai rien lu sur ce que signifie l' égalité . Certains diront que cela
===
signifie égal et du même type , mais ce n'est pas vraiment vrai. Cela signifie en fait que les deux opérandes font référence au même objet , ou dans le cas de types de valeur, ont la même valeur .Prenons donc le code suivant:
Pareil ici:
Ou même:
Ce comportement n'est pas toujours évident. Il y a plus dans l'histoire qu'être égal et être du même type.
La règle est:
Pour les types de valeur (nombres):
a === b
renvoie vrai sia
etb
ont la même valeur et sont du même typePour les types de référence:
a === b
renvoie true sia
etb
référence exactement le même objetPour les chaînes:
a === b
renvoie true sia
etb
sont les deux chaînes et contiennent exactement les mêmes caractèresCordes: le cas particulier ...
Les chaînes ne sont pas des types de valeur, mais en Javascript, elles se comportent comme des types de valeur, elles seront donc "égales" lorsque les caractères de la chaîne sont identiques et lorsqu'ils sont de la même longueur (comme expliqué dans la troisième règle)
Maintenant ça devient intéressant:
Mais qu'en est-il?:
Je pensais que les chaînes se comportaient comme des types de valeur? Eh bien, cela dépend de qui vous demandez ... Dans ce cas, a et b ne sont pas du même type.
a
est de typeObject
, tandis queb
est de typestring
. N'oubliez pas que la création d'un objet chaîne à l'aide duString
constructeur crée quelque chose de typeObject
qui se comporte comme une chaîne la plupart du temps .la source
new Number() == "0"
. Aussi dans Firefox:(function(){}) == "function () {\n}"
new String("123") !== "123"
. Ce sont des types différents. Simple, mais déroutant.String
les objets se comportent comme des chaînes comme tout autre objet .new String
ne doit jamais être utilisé, car cela ne crée pas de vraies chaînes. Une vraie chaîne et peut être faite avec des littéraux de chaîne ou appelerString
en fonction sansnew
, par exemple:String(0); //"0", Real string, not an object
Permettez-moi d'ajouter ce conseil:
En cas de doute, lisez les spécifications !
ECMA-262 est la spécification d'un langage de script dont JavaScript est un dialecte. Bien sûr, dans la pratique, il importe davantage de savoir comment se comportent les navigateurs les plus importants qu'une définition ésotérique de la façon dont quelque chose est censé être géré. Mais il est utile de comprendre pourquoi la nouvelle chaîne ("a")! == "a" .
Veuillez me laisser expliquer comment lire les spécifications pour clarifier cette question. Je vois que dans ce sujet très ancien, personne n'a eu de réponse pour l'effet très étrange. Donc, si vous pouvez lire une spécification, cela vous aidera énormément dans votre profession. C'est une compétence acquise. Continuons donc.
La recherche du fichier PDF pour === m'amène à la page 56 de la spécification: 11.9.4. L'opérateur Strict Equals (===) , et après avoir pataugé dans les spécifications, je trouve:
L'intérêt est l'étape 11. Oui, les chaînes sont traitées comme des types de valeur. Mais cela n'explique pas pourquoi la nouvelle chaîne ("a")! == "a" . Avons-nous un navigateur non conforme à ECMA-262?
Pas si vite!
Vérifions les types d'opérandes. Essayez-le par vous-même en les enveloppant dans typeof () . Je trouve que la nouvelle chaîne ("a") est un objet, et l'étape 1 est utilisée: retourne faux si les types sont différents.
Si vous vous demandez pourquoi une nouvelle chaîne ("a") ne renvoie pas de chaîne, que diriez-vous d'un exercice de lecture d'une spécification? S'amuser!
Aidiakapi a écrit ceci dans un commentaire ci-dessous:
new renvoie toujours un Object, même pour les constructeurs String . Et hélas! La valeur sémantique des chaînes (voir étape 11) est perdue.
Et cela signifie enfin: new String ("a")! == "a" .
la source
new String('x')
, car je n'ai jamais vu de code dans la nature qui utilise des objets wrapper primitifs, et je ne pense pas qu'il y ait beaucoup de bonnes raisons, surtout pas de nos jours. Avez-vous déjà rencontré du code qui le fait?new String()
.new String()
c'est probablement le moindre de vos soucis. Je comprends la préoccupation en théorie, mais encore une fois, avez-vous des exemples concrets? Pour moi, c'est comme la vieille anxiété que quelqu'un pouvait fixerundefined
à une autre valeur.En PHP et JavaScript, c'est un opérateur d'égalité stricte. Cela signifie qu'il comparera à la fois le type et les valeurs.
la source
var a = {}, b = {};
a == b
renvoie false.var a = {}, b = {};
Alors que les deuxa
etb
est en effet à la fois un objet, mais ils n'ont pas la même valeur, techniquement parlant. Ce sont des instances différentes . Notez que la comparaison des instances se comporte différemment de la comparaison des primitives. Ce qui ajoute probablement à cette confusion. Vous verrez un comportement de comparaison similaire si vous utilisez une version d'instance de types de données primitifs. Par exemplenew String('asdf')
ounew Number(5)
. Ex:new Number(5) == new Number(5)
est faux, même s'ils ont la même valeur.J'ai testé cela dans Firefox avec Firebug en utilisant un code comme celui-ci:
et
Mes résultats (testés cinq fois chacun et moyennés):
Je dirais donc que la minuscule différence (c'est plus de 100 000 itérations, rappelez-vous) est négligeable. La performance n'est pas une raison de le faire
===
. Tapez sécurité (enfin, aussi sûr que vous obtiendrez en JavaScript), et la qualité du code l'est.la source
==
désaccord.==
opérateur? N'oubliez pas, c'est à ce moment-là qu'il y a une augmentation des performances.===
excessive,==
mais vous avez tort que leurs performances soient essentiellement égales et que vous penseriez que ce test prouve que, et que beaucoup d'autres personnes ont convenu, est totalement absurde pour moi.En JavaScript, cela signifie la même valeur et le même type.
Par exemple,
mais
la source
Le === opérateur est appelé un opérateur de comparaison stricte, il ne diffère du == opérateur.
Prenons 2 vars a et b.
Pour que "a == b" soit évalué à vrai, a et b doivent avoir la même valeur .
Dans le cas de "a === b", a et b doivent avoir la même valeur et également le même type pour qu'il soit évalué comme vrai.
Prenez l'exemple suivant
En résumé ; l'utilisation de l' opérateur == peut donner la valeur true dans des situations où vous ne le souhaitez pas, il est donc plus sûr d' utiliser l' opérateur === .
Dans le scénario d'utilisation à 90%, peu importe celui que vous utilisez, mais il est pratique de connaître la différence lorsque vous obtenez un comportement inattendu un jour.
la source
Pourquoi
==
est-ce si imprévisible?Qu'obtenez-vous lorsque vous comparez une chaîne vide
""
avec le nombre zéro0
?true
Oui, c'est vrai selon
==
une chaîne vide et le nombre zéro sont en même temps.Et ça ne s'arrête pas là, en voici un autre:
Les choses deviennent vraiment étranges avec les tableaux.
Puis plus bizarre avec des cordes
Ça s'empire:
Quand est égal pas égal?
Permettez-moi de le répéter:
Et ce ne sont que les trucs fous que vous obtenez avec les primitives.
C'est un tout nouveau niveau de fou lorsque vous l'utilisez
==
avec des objets.À ce stade, vous vous demandez probablement ...
Pourquoi cela arrive-t-il?
Et bien c'est parce que contrairement à "triple equals" (
===
) qui vérifie juste si deux valeurs sont identiques.==
fait tout un tas d'autres trucs .Il a un traitement spécial pour les fonctions, un traitement spécial pour les valeurs nulles, non définies, les chaînes, vous l'appelez.
C'est assez farfelu.
En fait, si vous essayez d'écrire une fonction qui fait quoi,
==
cela ressemblera à ceci:Qu'est-ce que cela signifie?
Cela signifie que
==
c'est compliqué.Parce que c'est compliqué, il est difficile de savoir ce qui se passera lorsque vous l'utiliserez.
Ce qui signifie que vous pourriez vous retrouver avec des bugs.
La morale de l'histoire est donc ...
Rendez votre vie moins compliquée.
Utilisez
===
au lieu de==
.La fin.
la source
looseEqual
as tort.Function == Function.toString()
est vrai, maislooseEqual(Function, Function.toString())
est faux. Je ne sais pas pourquoi vous filtrez les fonctions au début.typeof x === "object"
pour vérifier s'il s'agit d'un objet, mais `typeof ne fonctionne que pour les primitives non nulles. Vous pourriez être intéressé par ma liste de moyens appropriés pour vérifier si une valeur est un objet(function blah() { console.log("test"); }) != {valueOf:function(){return "function blah() { console.log(\"test\"); }";}}
- consultez ce JS Fiddle qui exécute tous les tests: jsfiddle.net/luisperezphd/7k6gcn6g (il y a 1225 permutations de test)==
fait beaucoup de choses, ce qui rend très difficile l'anticipation des résultats tout en===
étant beaucoup plus simple et prévisible, l'une des principales raisons===
étant le choix recommandé. (Je vais ajouter une note à la réponse en mentionnant votre point)===
vérifie les mêmes côtés sont de type et de valeur égaux .Exemple:
Exemple courant:
Un autre exemple courant:
Plusieurs fois , un typées contrôle serait à portée de main parce que vous ne vous inquiétez pas si la valeur est
undefined
,null
,0
ou""
la source
'string' !== 'number'
Diagramme d'exécution de Javascript pour une stricte égalité / Comparaison '==='
Diagramme d'exécution de Javascript pour une égalité / comparaison non stricte '=='
la source
string
flèche pointe vers la grande boîte grise, est-ce censé signifier que l'interrupteur transforme la chaîne en un nombre?string
est censé être comparé à un typenumber
, donc l'interrupteur regarde ce à quoi la chaîne doit être comparée et transforme la chaîne en conséquence?ToNumber
qui retournerait quand on lui donne différents types, donc si on lui donne une chaîne, elle ne choisira que la dernière option (et la convertira en un nombre).==
utiliseToNumber
uniquement dans les casstring == number
ouboolean == anything
ci - dessus (et uniquement sur lestring
/boolean
). Cela signifie==
qu'ils ne se convertiront jamaisundefined
ounull
même s'ils sont dans la zone grise. (Pour toute combinaison de l'unundefined
ou de l'autre ou desnull
deux,==
sera toujours renvoyétrue
. En outre, si une valeur est à gauche ou à droite n'a pas d'importance,==
(et===
) retournera le même résultat.)JavaScript
===
vs==
.la source
Cela signifie l' égalité sans type de contrainte de type coercition signifie que JavaScript ne convertit pas automatiquement les autres types de données en types de données de chaîne
la source
Dans un script typique, il n'y aura aucune différence de performances. Plus important peut être le fait que mille "===" est 1 Ko de plus que mille "==" :) Les profileurs JavaScript peuvent vous dire s'il y a une différence de performances dans votre cas.
Mais personnellement, je ferais ce que suggère JSLint. Cette recommandation n'est pas là en raison de problèmes de performances, mais parce que la contrainte de type signifie que
('\t\r\n' == 0)
c'est vrai.la source
L'opérateur de comparaison égale == prête à confusion et doit être évité.
Si vous DEVEZ vivre avec, souvenez-vous des 3 choses suivantes:
TABLE DE VÉRITÉ DE L'OPÉRATEUR ÉGAL À JAVASCRIPT
** ÉTRANGE: notez que deux valeurs quelconques sur la première colonne ne sont pas égales dans ce sens. **
la source
Il est peu probable qu'il y ait une différence de performances entre les deux opérations dans votre utilisation. Il n'y a pas de conversion de type à effectuer car les deux paramètres sont déjà du même type. Les deux opérations auront une comparaison de types suivie d'une comparaison de valeurs.
la source
Oui! C'est important.
===
L'opérateur en javascript vérifie la valeur ainsi que le type où, en tant==
qu'opérateur, vérifie simplement la valeur (saisit la conversion si nécessaire) .Vous pouvez facilement le tester. Collez le code suivant dans un fichier HTML et ouvrez-le dans le navigateur
Vous obtiendrez « faux » en alerte. Maintenant, modifiez la
onPageLoad()
méthode pour quealert(x == 5);
vous deveniez vraie .la source
===
L'opérateur vérifie l'égalité des valeurs ainsi que les types des variables.==
L'opérateur vérifie simplement l'égalité des valeurs des variables.la source
C'est un test de vérification strict.
C'est une bonne chose surtout si vous vérifiez entre 0 et faux et nul.
Par exemple, si vous avez:
Alors:
Tout retourne vrai et vous ne le voudrez peut-être pas. Supposons que vous ayez une fonction qui peut retourner le 0ème index d'un tableau ou false en cas d'échec. Si vous vérifiez avec "==" false, vous pouvez obtenir un résultat déroutant.
Donc, avec la même chose que ci-dessus, mais un test strict:
la source
0 != null
. -1JSLint vous donne parfois des raisons irréalistes de modifier des éléments.
===
a exactement les mêmes performances que==
si les types sont déjà les mêmes.Il est plus rapide uniquement lorsque les types ne sont pas identiques, auquel cas il n'essaie pas de convertir les types mais renvoie directement un faux.
Donc, à mon humble avis, humble avis JSLint peut être utilisé pour écrire du nouveau code, mais une sur-optimisation inutile doit être évitée à tout prix.
Cela signifie qu'il n'y a aucune raison de passer
==
à===
un chèque commeif (a == 'test')
lorsque vous le savez pour un fait qu'un ne peut être qu'une chaîne.Modifier beaucoup de code de cette façon fait perdre du temps aux développeurs et aux réviseurs et ne donne rien.
la source
Simplement
==
signifie la comparaison entre les opérandes avectype conversion
&
===
signifie comparaison entre opérandes sanstype conversion
La conversion de type en javaScript signifie que javaScript convertit automatiquement tous les autres types de données en types de données chaîne.
Par exemple:
la source
Un exemple simple est
la source
Les 2 réponses les plus importantes mentionnées sont == signifie égalité et === signifie identité. Malheureusement, cette déclaration est incorrecte.
Si les deux opérandes de == sont des objets, ils sont comparés pour voir s'ils sont le même objet. Si les deux opérandes pointent vers le même objet, l'opérateur égal renvoie true. Sinon, les deux ne sont pas égaux.
Dans le code ci-dessus, == et === deviennent faux car a et b ne sont pas les mêmes objets.
Cela signifie que si les deux opérandes de == sont des objets, == se comporte de la même manière que ===, ce qui signifie également identité. La différence essentielle de ces deux opérateurs concerne la conversion de type. == a une conversion avant de vérifier l'égalité, mais pas ===.
la source
En règle générale, j'utiliserais généralement
===
au lieu de==
(et!==
au lieu de!=
).Les raisons sont expliquées dans les réponses ci-dessus et Douglas Crockford est assez clair à ce sujet ( JavaScript: The Good Parts ).
Cependant, il existe une seule exception :
== null
est un moyen efficace de vérifier si «est nul ou non défini»:Par exemple, jQuery 1.9.1 utilise ce modèle 43 fois, et le vérificateur de syntaxe JSHint fournit même le
eqnull
option relaxante pour cette raison.À partir du guide de style jQuery :
la source
Le problème est que vous pourriez facilement avoir des ennuis car JavaScript a beaucoup de conversions implicites, ce qui signifie ...
Ce qui devient très vite un problème. Le meilleur exemple de la raison pour laquelle la conversion implicite est "diabolique" peut être extrait de ce code dans MFC / C ++ qui sera réellement compilé en raison d'une conversion implicite de CString en HANDLE qui est un type typedef de pointeur ...
Ce qui, évidemment, pendant l'exécution des choses très indéfinies ...
Google pour les conversions implicites en C ++ et STL pour obtenir certains des arguments contre ...
la source
0 == null
c'est faux.De la référence javascript de base
la source
Comparaison d'égalité:
Opérateur
==
Renvoie vrai, lorsque les deux opérandes sont égaux. Les opérandes sont convertis dans le même type avant d'être comparés.
Comparaison d'égalité et de type:
Opérateur
===
Renvoie true si les deux opérandes sont égaux et du même type. C'est généralement mieux et plus sûr si vous comparez de cette façon, car il n'y a pas de conversions de type en arrière-plan.
la source
Voici un tableau de comparaison pratique qui montre les conversions qui se produisent et les différences entre
==
et===
.Comme l'indique la conclusion:
http://dorey.github.io/JavaScript-Equality-Table/
la source
nul et non défini sont le néant, c'est-à-dire
Ici
a
etb
n'ont pas de valeurs. Alors que 0, false et '' sont toutes des valeurs. Une chose commune entre tous ces éléments est qu'ils sont tous des valeurs de falsification, ce qui signifie qu'ils satisfont tous à des conditions de falsification.Ainsi, le 0, le faux et le '' forment ensemble un sous-groupe. Et d'autre part, null & undefined forment le deuxième sous-groupe. Vérifiez les comparaisons dans l'image ci-dessous. nul et non défini serait égal. Les trois autres seraient égaux les uns aux autres. Mais, ils sont tous traités comme des conditions de falsification en JavaScript.
C'est la même chose que n'importe quel objet (comme {}, tableaux, etc.), la chaîne non vide et la valeur booléenne true sont toutes des conditions véridiques. Mais, ils ne sont pas tous égaux.
la source