Comment parseInt()
et comment Number()
se comporter différemment lors de la conversion de chaînes en nombres?
la source
Comment parseInt()
et comment Number()
se comporter différemment lors de la conversion de chaînes en nombres?
Eh bien, ils sont sémantiquement différents , le Number
constructeur appelé en tant que fonction effectue une conversion de type et parseInt
effectue une analyse , par exemple:
// parsing:
parseInt("20px"); // 20
parseInt("10100", 2); // 20
parseInt("2e1"); // 2
// type conversion
Number("20px"); // NaN
Number("2e1"); // 20, exponential notation
Gardez à l'esprit que si parseInt
détecte un zéro de tête sur la chaîne, il analysera le nombre en base octale, cela a changé sur ECMAScript 5, la nouvelle version de la norme, mais cela prendra beaucoup de temps pour entrer dans les implémentations du navigateur (c'est une incompatibilité avec ECMAScript 3), parseInt
ignorera également les caractères de fin qui ne correspondent à aucun chiffre de la base actuellement utilisée.
Le Number
constructeur ne détecte pas les octaux:
Number("010"); // 10
parseInt("010"); // 8, implicit octal
parseInt("010", 10); // 10, decimal radix used
Mais il peut gérer des nombres en notation hexadécimale, tout comme parseInt
:
Number("0xF"); // 15
parseInt("0xF"); //15
De plus, une construction largement utilisée pour effectuer une conversion de type numérique, est l' opérateur unaire +
(p. 72) , elle équivaut à utiliser le Number
constructeur en tant que fonction:
+"2e1"; // 20
+"0xF"; // 15
+"010"; // 10
Number()
traite les octales un peu comme hexadécimal et binaire:Number('0o10') == 8
les deux premiers vous donneront de meilleures performances car ils retournent une primitive au lieu d'un objet.
la source
new Number()
est différent deNumber()
.typeof Number("123") => number
new Number("1") != new Number("1")
. NE JAMAIS UTILISERnew Number
. Jamais jamais jamais jamais.Number("1")
, en revanche, est parfaitement raisonnable.let x = new Number("2"); let y = new Number("2");
et ensuite je vérifie l'égalité pour quelque raison que ce soit,if (x == y) { doSomething(); }
logiquement,doSomething
il faut l'appeler. Mais ce n'est pas le cas. Aussi , si vous deviez analyser un seul numéro ,let x = new Number("2");
puisx === 2
serait faux. C'est une raison claire pour laquelle vous ne devriez pas utilisernew Number
Si vous recherchez des performances, vous obtiendrez probablement les meilleurs résultats avec un décalage à droite au niveau du bit
"10">>0
. Multipliez également ("10" * 1
) ou non (~~"10"
). Tous sont beaucoup plus rapides deNumber
etparseInt
. Ils ont même "fonction" renvoyant 0 pour un argument non numérique. Voici des tests de performances .la source
Number
etparseInt
toujours plus lent à 99% que les autres. De plus, ils sont moins attrayants visuellement aussi :-)parseInt
ouNumber
sont plus préférables. Si vous programmez un émulateur N64 avec des millions de conversions par seconde, vous pourriez envisager ces astuces.(2**31).toString() >> 0
débordera-2147483648
. Vous pouvez utiliser>>>
au lieu de>>
pour que JavaScript traite l'opérande comme un entier 32 bits non signé , mais tout nombre supérieur à celui-2**32 - 1
ci débordera également.J'ai trouvé deux liens de performances comparables entre plusieurs façons de convertir
string
enint
.http://jsben.ch/#/zGJHM
http://phrogz.net/js/string_to_number.html
la source
Une différence mineure est ce qu'ils convertissent
undefined
ounull
,tandis que
la source
Résumé:
parseInt()
:NaN
sera retourné.parseInt()
fonction rencontre une valeur non numérique, elle coupera le reste de la chaîne d'entrée et analysera uniquement la partie jusqu'à la valeur non numérique.undefined
ou 0, JS supposera ce qui suit:ES5
spécifie que 10 doit alors être utilisé. Cependant, cela n'est pas pris en charge par tous les navigateurs, donc spécifiez toujours radix si vos chiffres peuvent commencer par un 0.Number()
:Number()
constructeur peut convertir n'importe quel argument saisi en nombre. Si leNumber()
constructeur ne peut pas convertir l'entrée en nombre,NaN
sera retourné.Number()
constructeur peut également gérer le nombre hexadécimal, ils doivent commencer par0x
.Exemple:
la source
J'utilise toujours parseInt, mais méfiez-vous des zéros de tête qui le forceront en mode octal .
la source
parseInt(value, radix)
que vous n'ayez pas de conversions accidentelles en mode octal , etc.0
, même en mode non strict. Mais cela a été corrigé et maintenant les zéros non significatifs sont simplement ignorés, ainsiparseInt("070")
le deviendrait70
.parseInt()
.parseInt()
-> Analyse un nombre en redix spécifié.Number()
-> Convertit la valeur spécifiée en son équivalent numérique ou NaN s'il ne le fait pas.Par conséquent, pour convertir une valeur non numérique en nombre, nous devons toujours utiliser la fonction Number ().
par exemple.
Il existe différents cas de coin pour les
parseInt()
fonctions comme pour la conversion de redix, nous devons donc éviter d'utiliser la fonction parseInt () à des fins de conversion.Maintenant, pour vérifier la météo, la valeur fournie est numérique ou non, nous devons utiliser la
isNaN()
fonction nativela source
parseInt se convertit en un nombre entier, c'est-à-dire qu'il supprime les décimales. Le nombre n'est pas converti en entier.
la source
C'est une bonne idée de rester à l'écart de parseInt et d'utiliser Number et Math.round sauf si vous avez besoin d'un hex ou d'un octal. Les deux peuvent utiliser des chaînes. Pourquoi en rester éloigné?
Il dépeint complètement de très gros ou très petits nombres. Curieusement, cela fonctionne normalement si ces entrées sont une chaîne.
Au lieu de risquer de trouver des bogues avec ceci et les autres problèmes mentionnés, j'éviterais simplement parseInt à moins que vous n'ayez besoin d'analyser autre chose que la base 10. Number, Math.round, Math.foor et .toFixed (0) peuvent tous faire les mêmes choses que parseInt peut être utilisé sans avoir ces types de bogues.
Si vous voulez ou devez vraiment utiliser parseInt pour certaines de ses autres qualités, ne l'utilisez jamais pour convertir des flottants en pouces.
la source