Question

Je parcourais la bibliothèque underscore.js et j'ai trouvé quelque chose que je n'ont pas rencontré auparavant:

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

Qu'est-ce que l'opérateur de + faire là-bas? Pour le contexte, voici une lien direct à cette partie le fichier.

Était-ce utile?

La solution

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

Autres conseils

Selon MDN:

L'opérateur plus unaire précède son opérande et évalue son opérande mais les tentatives de le convertir en un certain nombre, si ce n'est déjà. Par exemple, y = + x prend la valeur de x et ayants droit que pour y; qui est, si x était 3, y obtiendraient la valeur 3 et x conserverait la valeur 3; mais si x était la chaîne « 3 », y aurait aussi obtenir la valeur 3. Bien que la négation unaire (-) peut également convertir les non-numéros, plus unaire est le moyen le plus rapide et préféré de transformer quelque chose en nombre, parce qu'il ne fonctionne pas d'autres opérations sur le nombre. Il peut convertir des représentations de chaîne de nombres entiers et flottants, ainsi que les valeurs non-string vrai, faux, et nul. entiers à la fois décimal et hexadécimal ( « 0x » préfixés) formats sont pris en charge. Les nombres négatifs sont pris en charge (mais pas pour hex). Si elle ne peut pas parser une valeur particulière, il évaluera NaN.

Il est une façon de faire en sorte que obj.length est un nombre plutôt qu'une chaîne potentiel. La raison est que l'=== échouera si la longueur (quelle qu'en soit la raison) est une variable de chaîne, par exemple "3".

Il est un bon hack pour vérifier si obj.length est du type number ou non. Vous voyez, l'opérateur + peut être utilisé pour la contrainte de chaîne. Par exemple:

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

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

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

  1. stricte égalité et de l'inégalité (par exemple 3 === "3" exprime false).
  2. L'égalité et l'inégalité normale (par exemple 3 == "3" exprime vrai).

stricte égalité et l'inégalité ne contraignent pas la valeur. D'où le nombre 3 ne correspond pas à la chaîne "3". l'égalité normale et l'inégalité ne contraint la valeur. D'où le nombre 3 est égal à la chaîne "3".

Maintenant, le code ci-dessus simplement obj.length à contraint un numéro à l'aide de l'opérateur + et strictement vérifie si la valeur avant et après la contrainte sont les mêmes (à savoir obj.length du number de type). Il est logiquement équivalent au code suivant (seulement plus succincte):

if (typeof obj.length === "number") {
    // code
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top