En JavaScript, existe-t-il une différence de performances entre l’utilisation d’un double égal (==
) et celle d’un triple égal (===
)?
Exemple: if (foo == bar)
vs if (foo === bar)
Une comparaison stricte (===
) sera toujours légèrement plus rapide, mais la différence est généralement négligeable .
Il est tout à fait logique de préférer ===
si vous savez avec certitude que vous n’avez pas besoin de coercition dans la comparaison. Ce sera toujours au moins aussi rapide que ==
.
Si les types comparés sont les mêmes, ils sont identiques . C'est-à-dire qu'ils utilisent le même algorithme exact .
Si les types sont different , les performances ne sont pas pertinentes. Soit vous avez besoin de coercition de type, soit vous n'en avez pas. Si vous n'en avez pas besoin, n'utilisez pas ==
car le résultat obtenu risque d'être inattendu.
Edit: pour référence, voici le par la spécification du Dr. Axel Rauschmayer http://www.2ality.com/2011/06/javascript- égalité.html Vraiment super rédiger.
===
(égalité stricte): considère uniquement les valeurs égales du même type.
==
(égalité claire)
Dans tous les environnements Javascript modernes, ils sont mis en œuvre de manière complètement différente. En termes simples, ==
vérifie la ressemblance en convertissant des variables données en primitives (chaîne, nombre, booléen). ===
teste la stricte similitude, ce qui signifie exactement le même objet ou la même valeur primitive sans conversion.
Si vous faites objOne == objTwo
Ce qui se passe réellement est [[EQUALS]].call(objOne.valueOf(), objTwo.valueOf())
La résolution de valueOf peut être quelque peu impliquée, rebondissant entre les fonctions exposées dans JS et les commandes internes du moteur. Autant dire que la comparaison aboutira toujours avec deux valeurs forcées à primitives ou une erreur sera renvoyée.
Edit: EQUALS
essaye d’abord le STRICT_EQUALS
, ce qui empêche le reste du processus.
Le bit intéressant ici est que valueOf (et son partenaire toString) sont écrasables. Exécutez ce morceau de code dans Chrome (je pense que tout webkit, pas sûr si JSC et V8 partagent cette friandise). Cela va exploser votre état d'esprit:
var actions = [];
var overload = {
valueOf: function(){
var caller = arguments.callee.caller;
actions.Push({
operation: caller.name,
left: caller.arguments[0] === this ? "unknown" : this,
right: caller.arguments[0]
});
return Object.prototype.toString.call(this);
}
};
overload.toString = overload.valueOf;
overload == 10;
overload === 10;
overload * 10;
10 / overload;
overload in window;
-overload;
+overload;
overload < 5;
overload > 5;
[][overload];
overload == overload;
console.log(actions);
Sortie:
[ { operation: 'EQUALS',
left: overload,
right: 10 },
{ operation: 'MUL',
left: overload,
right: 10 },
{ operation: 'DIV',
left: 'unknown',
right: overload },
{ operation: 'IN',
left: overload,
right: DOMWindow },
{ operation: 'UNARY_MINUS',
left: overload,
right: undefined },
{ operation: 'TO_NUMBER',
left: overload,
right: undefined },
{ operation: 'COMPARE',
left: overload,
right: 5 },
{ operation: 'COMPARE',
left: 'unknown',
right: overload },
{ operation: 'ToString',
left: 'unknown',
right: overload } ]
L’essence de la différence entre ==
et ===
est illustrée par ===
ne figurant pas dans cette liste. Il saute le voyage dans JavascriptLand entièrement. Cette aventure coûte cher en comparant les performances.
Cependant, vous devez tenir compte des optimisations de moteur. Pour la plupart des objets, le moteur sera capable de couper la plupart des marches et de rester dans NativeLand et d'obtenir presque les mêmes performances. Mais cela n’est pas une garantie et si quelque chose empêche le moteur d’utiliser les optimisations, une certaine fantaisie dans votre code ou de remplacer les commandes intégrées ou une multitude de problèmes, vous voyez immédiatement le résultat en termes de performances. ===
le force.
===
est à peu près la seule chose immuable en Javascript.
En raison des performances, je pense que ===
a de meilleures performances, car ===
est plus strict que ==
,
par exemple. essayez ce qui suit dans la console Chrome.
> 1 == '1'
true
> 1 === '1'
false
==
doit vérifier plus de choses que ===
==
semble être légèrement plus rapide que ===
.
De manière marginale, je veux dire que je peux voir une différence de quelques millisecondes sur les interations de plusieurs millions de tests. Vous ne pouvez probablement pas avoir besoin du gain de performance, plutôt que d’utiliser ce qui convient le mieux à la tâche à accomplir.
EDIT: en fait, semble dépendre de/quoi/que vous comparez et de la mise en oeuvre du navigateur. En d'autres termes, ne vous inquiétez pas pour ça.
Cela dépend des éléments comparés. Puisque "===" est plus strict que "==", il devrait retourner faux plus vite que "==". Cependant, si les deux éléments sont strictement égaux, "===" devrait prendre plus de temps que "==" car il doit vérifier davantage de propriétés pour vérifier leur égalité.