Comment parseInt()
et comment Number()
se comporter différemment lors de la conversion de chaînes en nombres?
Comment parseInt()
et comment Number()
se comporter différemment lors de la conversion de chaînes en nombres?
Réponses:
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
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)
les deux premiers vous donneront de meilleures performances car ils retournent une primitive au lieu d'un objet.
new Number()
est différent de Number()
. 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 de Number
et parseInt
. Ils ont même "fonction" renvoyant 0 pour un argument non numérique. Voici des tests de performances .
Number
et parseInt
toujours plus lent à 99% que les autres. De plus, ils sont moins attrayants visuellement aussi :-)
parseInt
ou Number
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
en int
.
parseInt(str,10)
parseFloat(str)
str << 0
+str
str*1
str-0
Number(str)
Une différence mineure est ce qu'ils convertissent undefined
ou null
,
Number() Or Number(null) // returns 0
tandis que
parseInt() Or parseInt(null) // returns NaN
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 le Number()
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 par 0x
.console.log(parseInt('0xF', 16)); // 15
// z is no number, it will only evaluate 0xF, therefore 15 is logged
console.log(parseInt('0xFz123', 16));
// because the radix is 10, A is considered a letter not a number (like in Hexadecimal)
// Therefore, A will be cut off the string and 10 is logged
console.log(parseInt('10A', 10)); // 10
// first character isnot a number, therefore parseInt will return NaN
console.log(parseInt('a1213', 10));
console.log('\n');
// start with 0X, therefore Number will interpret it as a hexadecimal value
console.log(Number('0x11'));
// Cannot be converted to a number, NaN will be returned, notice that
// the number constructor will not cut off a non number part like parseInt does
console.log(Number('123A'));
// scientific notation is allowed
console.log(Number('152e-1')); // 15.21
J'utilise toujours parseInt, mais méfiez-vous des zéros de tête qui le forceront en mode octal .
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, ainsi parseInt("070")
le deviendrait 70
.
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.
Number("")//0
parseInt("")//NaN
Number("123")//123
parseInt("123")//123
Number("123ac") //NaN,as it is a non numeric string
parsInt("123ac") //123,it parse decimal number outof string
Number(true)//1
parseInt(true) //NaN
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 native
parseInt se convertit en un nombre entier, c'est-à-dire qu'il supprime les décimales. Le nombre n'est pas converti en entier.
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é?
parseInt(0.001, 10)
0
parseInt(-0.0000000001, 10)
-1
parseInt(0.0000000001, 10)
1
parseInt(4000000000000000000000, 10)
4
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.
parseInt("-0.0000000001", 10)
0
parseInt("0.0000000001", 10)
0
parseInt("4000000000000000000000", 10)
4e+21
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.