Eh bien, comme une mise en œuvre EMCAScript, Javascript va suivre la Résumé Relational Comparaison algorithme tel que défini dans la section 11.8.5 de l'ECMA-262.
Tout d'abord Javascript appliquera à la fois opérandes l'opérateur interne ToPrimitive
, qui doit retourner une valeur primitive ( non définie, booléen, chaîne, null ou nombre) sur la base des arguments passés à il. Si une valeur primitive est transmise à ToPrimitive
, la valeur de retour est la valeur d'argument transmise à l'opérateur, s'il s'agit d'un objet une méthode interne appelée tous les objets dans Javascript est appelée [[DefaultValue]]. Cette méthode est responsable du renvoi d'un type primitif représenté par un objet. En fonction du type de code, cette méthode peut appeler les méthodes toString
ou valueOf
de l'objet.
Par exemple:
var x = {valueOf: function() { return 3; }};
console.log(x > 2); // true
console.log(x < 1); // false
console.log(x == 3); // true
Comment le Javascript décider quelle méthode il devrait appeler? Eh bien, l'opérateur ToPrimitive
peut recevoir un paramètre facultatif, il est utilisé pour donner la préférence à un type spécifique, par ex. Number
ou String
. Si Number
est passé, la méthode valueOf
sera appelée en premier, si cette méthode n'existe pas dans l'objet ou ne renvoie pas un type primitif, toString
est appelée alors. Si String
est passé, l'inverse se produit: toString
est appelé en premier, s'il n'existe pas dans l'objet ni renvoie une valeur primitive, valueOf
est appelée.
C'est pourquoi, dans l'extrait ci-dessus, je peux comparer librement un objet et un type primitif. Il est vraiment important de comprendre quand il s'agit de comparaison. Ensuite, si les deux opérandes sont Strings
, Javascript suivra un algorithme intéressant et spécifique lié à Unicode Standard, vérifiant les valeurs des points de code. Sinon, Javascript jettera les deux opérandes à Number
et leur valeur mathématique sera comparée. Notez que si l'un d'entre eux est NaN la comparaison évalue à undefined, ce qui serait false dans une instruction if
.
Quelques exemples:
// true => ToNumber(true) > ToNumber(false)
console.log(true > false);
// true => ToNumber("5") < ToNumber(10)
console.log("5" < 10);
// false ToNumber(ToPrimitive(obj, Number)) == ToNumber(10)
console.log(({valueOf: function() { return 10}}) > 10);
// false, it's not related to the length of the strings,
// the code point value of each char is used to evaluate the comparison
console.log('Hello worlds' > 'hello');
espère que cela aide à clarifier quelque chose.
Je suppose que la coercition de type? – Joseph