Comment parseInt()
et Number()
se comportent-ils différemment lors de la conversion de chaînes en nombres?
Bien, ils sont sémantiquement différents , le constructeur Number
appelé en tant que fonction exécute le type conversion et parseInt
effectue l'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 non significatif sur la chaîne, il analysera le nombre en base octale. Cela a changé sous ECMAScript 5, la nouvelle version de la norme, mais la mise en œuvre du navigateur prendra beaucoup de temps ( 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 constructeur Number
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 les 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 nary +
Operator (p. 72) , elle revient à utiliser le constructeur Number
en tant que fonction:
+"2e1"; // 20
+"0xF"; // 15
+"010"; // 10
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 il retourne une primitive au lieu d'un objet.
Si vous recherchez des performances, alors vous obtiendrez probablement les meilleurs résultats avec le décalage binaire à droite "10">>0
. Également multiplier ("10" * 1
) ou non (~~"10"
). Tous sont beaucoup plus rapides de Number
et parseInt
. Ils ont même "feature" renvoyant 0 pour l'argument non numérique. Voici tests de performance .
J'ai trouvé deux liens de performances comparés 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 de undefined
ou null
,
Number() Or Number(null) // returns 0
tandis que
parseInt() Or parseInt(null) // returns NaN
parseInt()
:
NaN
sera retourné.parseInt()
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 être utilisé à ce moment-là. Cependant, ceci n'est pas supporté par tous les navigateurs, par conséquent, spécifiez toujours la base si vos nombres peuvent commencer par 0.Number()
:
Number()
peut convertir n'importe quel argument en entrée en un nombre. Si le constructeur Number()
ne peut pas convertir l'entrée en un nombre, NaN
sera renvoyé.Number()
peut également gérer un nombre hexadécimal, il doit 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 non significatifs qui le forceront en mode octal.
parseInt()
-> Analyse un nombre en fonction du redix spécifié. Number()
-> Convertit la valeur spécifiée en son équivalent numérique ou en NaN si ce n'est pas le cas.
Par conséquent, pour convertir une valeur non numérique en nombre, nous devrions 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
parseInt()
fonctionne de la même manière que la conversion redix. Par conséquent, nous devrions éviter d'utiliser la fonction parseInt () à des fins de coersion. Maintenant, pour vérifier si la valeur fournie est numérique ou non, nous devrions utiliser la fonction nativeisNaN()
parseInt est converti en un nombre entier, c'est-à-dire qu'il supprime les décimales. Le nombre ne convertit pas 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'hex ou d'octal. Les deux peuvent utiliser des chaînes. Pourquoi rester loin de ça?
parseInt(0.001, 10)
0
parseInt(-0.0000000001, 10)
-1
parseInt(0.0000000001, 10)
1
parseInt(4000000000000000000000, 10)
4
Il abat complètement les bouchers très gros ou très petits. 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 difficilement de trouver des bogues avec ceci et les autres pièges mentionnés, je voudrais simplement éviter l'analyse syntaxique sauf si vous devez analyser quelque chose d'autre que la base 10. Nombre, Math.round, Math.foor et .toFixed (0) peuvent tous faire les mêmes choses que parseInt peut être utilisé sans ces types de bogues.
Si vous voulez vraiment ou devez utiliser parseInt pour certaines de ses qualités, ne l'utilisez jamais pour convertir des floats en ints.