Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

L'operateur === en JavaScript (Strict equality Operator)

En lisant les sources de Microsoft Ajax Library (Beta 1) j'ai constaté l'utilisation (massive) de l'opérateur "===" (strict equality operator). Curieux j'ai cherché ce que cela voulait dire exactement, j'ai donc directement regardé les specs de JavaScript aussi connu sous le nom de ECMA-262 Edition 3.

Voici la doc officielle :

11.9.6 The Strict Equality Comparison Algorithm

The comparison x === y, where x and y are values, produces true or false. Such a comparison is performed as
follows:

  1. If Type(x) is different from Type(y), return false.
  2. If Type(x) is Undefined, return true.
  3. If Type(x) is Null, return true.
  4. If Type(x) is not Number, go to step 11.
  5. If x is NaN, return false.
  6. If y is NaN, return false.
  7. If x is the same number value as y, return true.
  8. If x is +0 and y is -0, return true.
  9. If x is -0 and y is +0, return true.
  10. Return false.
  11. If Type(x) is String, then return true if x and y are exactly the same sequence of characters (same length and same characters in corresponding positions); otherwise, return false.
  12. If Type(x) is Boolean, return true if x and y are both true or both false; otherwise, return false.
  13. Return true if x and y refer to the same object or if they refer to objects joined to each other (section 13.1.2). Otherwise, return false.

Pour une fois on ne peut pas dire que les spécification ne sont pas simple, mais quelle est la différence avec l'opérateur == ?

11.9.3 The Abstract Equality Comparison Algorithm

The comparison x == y, where x and y are values, produces true or false. Such a comparison is performed as follows:

  1. If Type(x) is different from Type(y), go to step 14.
  2. If Type(x) is Undefined, return true.
  3. If Type(x) is Null, return true.
  4. If Type(x) is not Number, go to step 11.
  5. If x is NaN, return false.
  6. If y is NaN, return false.
  7. If x is the same number value as y, return true.
  8. If x is +0 and y is -0, return true.
  9. If x is -0 and y is +0, return true.
  10. Return false.
  11. If Type(x) is String, then return true if x and y are exactly the same sequence of characters (same length and same characters in corresponding positions). Otherwise, return false.
  12. If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false.
  13. Return true if x and y refer to the same object or if they refer to objects joined to each other (section 13.1.2).Otherwise, return false.
  14. If x is null and y is undefined, return true.
  15. If x is undefined and y is null, return true.
  16. If Type(x) is Number and Type(y) is String,return the result of the comparison x == ToNumber(y).
  17. If Type(x) is String and Type(y) is Number,return the result of the comparison ToNumber(x) == y.
  18. If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
  19. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
  20. If Type(x) is either String or Number and Type(y) is Object,return the result of the comparison x == ToPrimitive(y).
  21. If Type(x) is Object and Type(y) is either String or Number,return the result of the comparison ToPrimitive(x) == y.
  22. Return false

 La première grosse différence se situe au niveau de l'inteprétation des arguments. prenons des exemples.

var a1 = ('1' == 1); // true var a2 = ('1' === 1); // false var a3 = ('true' == true); // true var a4 = ('true' === true); // false

Voici un autre cas un peu plus interessant qui nous permet de comparer des objets complexe avec un literal.

var Personne = function(firstName, lastName){ this._firstName = firstName; this._lastName = lastName; } Personne.prototype.toString = function(){ return this._firstName + ' ' + this._lastName; } var p = new Personne('Cyril', 'DURAND'); var b1 = (p == 'Cyril DURAND'); // true var b1 = (p === 'Cyril DURAND'); // false

D'autres petits exemples où l'opérateur "==" se comporte de la même façon que l'opérateur "==="

var p1 = new Personne('Cyril', 'DURAND'); var p2 = new Personne('Cyril', 'DURAND'); var c1 = (p1 == p2); // false var c2 = (p1 === p2); // false

var p1 = new Personne('Cyril', 'DURAND'); var p2 = p1; var c1 = (p1 == p2); // true var c2 = (p1 === p2); // true

En appelant une fonction avec un paramètre non renseigné, l'opérateur "===" nous permet de savoir si l'argument vaut null où a été omis.

function toto(val){ var d1 = (val == null); // true var d2 = (val === null); // false } toto()

Conclusion

La différence entre "==" et "===" et que l'opérateur "==" vérifie seulement la valeur alors que l'opérateur "===" vérfie en plus le type.

Cela peut être interessant pour connaitre les arguments optionels des fonctions mais je ne comprend pas quel est l'intérêt de l'utiliser aussi massivement, cela gaspille un caractère "inutilement" ! J'opte pour les performances puisque l'opérateur "===" n'évalue pas les arguments, mais les quelques tests que j'ai effectués m'indique le contraire. En plus il est trés difficile de trouver de la doc sur les opérateurs puisqu'il sont composé de caracteres spéciaux. Si quelqu'un a des infos la dessus, je suis preneur.

Je viens de me rappeller un billet de Bertrand Leroy : I love Javascript! en gros son explication et que puisque "===" vérifie aussi le type alors c'est mieux que "==" et la seule raison de ne pas l'utiliser c'est pour gagner un caractère ... ce qui représente "quand même" 109 octets dans le fichier MicrosoftAjax.js. Je vais me satisfaire de cette réponse, même si j'aimerais bien avoir confirmation que "==" n'est pas plus rapide que "===".

Posted: mercredi 29 novembre 2006 02:31 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

badrbadr a dit :

-_-

Tout ça parce que Javascript est super tolérent. Vive les langages compilés avec typage fort (le plus d'erreurs à la compilation) (point de vue purement personnel et légèrement agrémenté de sauce "Troll" :)

Merci pour nous l'avoir indiquer Cyril

# novembre 29, 2006 02:48

Thomas LEBRUN a dit :

A noter que cet opérateur triple égal (===) existe dans d'autres langages de programmation (au moins en PHP) :)

# novembre 29, 2006 11:24

malek a dit :

Cet opérateur existe également dans ActionScript, et son complément !== inégalité strict (valeur et type)

# novembre 29, 2006 11:47

cyril a dit :

ils font quoi dans les autres langages ?

Malek, normal que cet opérateur existe en ActionScript puisque cela fait partis des specs de l'Ecma Script et ActionScript est une de ses implémentations :-)

# novembre 29, 2006 11:58

Thomas LEBRUN a dit :

En PHP, il a le même rôle qu'en JS: il teste le type ET la valeur :)

A+

# novembre 29, 2006 13:56

kankrelune a dit :

@ badrbadr... commentaire totalement inutile... un langage compilé n'a bien évidement pas les mêmes applications qu'un langage interprété... qui plus est la comparaison abstraite peut être utile dans certains cas... .. .

Pour revenir au sujet d'origine... je ne sais pas si la comparaison strict de javascript est la même que celle de php mais en php il est préférable d'utiliser la comparaison strict pour deux raison...

- 1 - comme dit précédemment la comparaison strict compare la valeur et le type... par exemple

true == 1 && false == 0

mais

true !== 1 && false !== 0

- 2 - la comparaison strict est plus rapide et monopolise moins de ressource car la comparaison abstraite se fait sur une conversion numérique des deux valeur... avec la comparaison strict on évite cette conversion inutile dans la plupart des cas

Voili voilou... par contre je ne sais pas si ça marche pareil en javascript il y a peut être, même surement, des différences... .. .

@ tchaOo°

# février 9, 2007 03:21

madtoto a dit :

Bonjour, même des décennies plus tard un bon article reste un bon article, merci pour ces explications.

Je trouve ça curieux en javascript la variable n'est pas typée par un constructeur à la déclaration mais à son affectation... Un choix propre aux langages interprétés ?

Spock doit certainement penser qu'un opérateur logique effectuant moins d'opération est plus performant.

Sur ce nouvel éclairage et les exigences dont il relève j'opte pour une approche plus stricte; je vais donc rajouter un caractère de plus

;)

# juin 24, 2013 00:27
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01