+ Opérateur avant expression en javascript: qu'est-ce qu'il fait?

J'ai parcouru la bibliothèque underscore.js et j'ai trouvé quelque chose que je n'ai pas rencontré avant:

if (obj.length === +obj.length) { ... } 

Qu'est-ce que cet opérateur + fait là-bas? Pour le contexte, voici un lien direct vers cette partie du fichier.

L'opérateur unary + peut être utilisé pour convertir une valeur en un nombre en JavaScript. Le soulignement semble vérifier que la propriété .length est un nombre, sinon il ne sera pas égal à lui-même-converti-à-un-nombre.

Selon MDN :

L'opérateur unary plus précède son opérande et évalue son opérande mais tente de le convertir en un nombre, s'il ne l'est pas déjà. Par exemple, y = + x prend la valeur de x et attribue cela à y; C'est-à-dire si x était 3, y obtiendrait la valeur 3 et x conserverait la valeur 3; Mais si x était la chaîne "3", y obtiendrait également la valeur 3. Bien que la négation unaire (-) puisse également convertir des non-nombres, unary plus est la manière la plus rapide et préférée de convertir quelque chose en nombre, car ce n'est pas le cas Effectuer d'autres opérations sur le numéro. Il peut convertir des représentations de chaîne d'entiers et de flotteurs, ainsi que les valeurs non string vraies, fausses et nulles. Les nombres entiers en format décimal et hexadécimal ("0x" préfabriqués) sont pris en charge. Les nombres négatifs sont pris en charge (mais pas pour les hexadécimaux). Si elle ne peut pas analyser une valeur particulière, elle évaluera à NaN.

C'est une façon d'assurer que obj.length soit un nombre plutôt qu'une chaîne potentielle. La raison en est que le === échouera si la longueur (pour une raison quelconque) est une variable de chaîne, par exemple "3".

C'est un joli hack pour vérifier si obj.length est du type ou non. Vous voyez, l'opérateur + peut être utilisé pour la coercition des chaînes. Par exemple:

 alert(+ "3" + 7); // alerts 10 

Ceci est possible car l'opérateur + contraint la chaîne "3" au numéro 3 . Par conséquent, le résultat est 10 et non "37" .

En outre, JavaScript dispose de deux types d'opérateurs d'égalité et d'inégalité:

  1. L'égalité et l'inégalité strictes (par ex. 3 === "3" s'exprime faussement).
  2. L'égalité et l'inégalité normales (par ex. 3 == "3" s'exprime vraisement).

L'égalité stricte et l'inégalité ne contraignent pas la valeur. Par conséquent, le numéro 3 n'est pas égal à la chaîne "3" . L'égalité et l'inégalité normales contraignent la valeur. Par conséquent, le nombre 3 est égal à la chaîne "3" .

Maintenant, le code ci-dessus contraint simplement obj.length à un nombre en utilisant l'opérateur + , et vérifie strictement si la valeur avant et après la coercition est la même (c.-à-d. obj.length d'objet du number type). C'est logiquement équivalent au code suivant (seulement plus succinct):

 if (typeof obj.length === "number") { // code }