web-dev-qa-db-fra.com

Quel est le meilleur, nombre (x) ou parseFloat (x)?

Ce qui est mieux?

Je demande ceci juste pour pouvoir raser quelques octets, car je peux utiliser + x au lieu de nombre (x). Parsefloat fait-il mieux?

123
Namanyay Goel

La différence entre parseFloat et Number

parseFloat/parseInt sert à analyser une chaîne, tandis que Number/+ sert à contraindre une valeur à un nombre. Ils se comportent différemment. Mais d'abord, regardons où ils se comportent de la même manière:

parseFloat('3'); // => 3
Number('3'); // => 3
parseFloat('1.501'); // => 1.501
Number('1.501'); // => 1.501
parseFloat('1e10'); // => 10000000000
Number('1e10'); // => 10000000000

Donc, tant que vous avez une entrée numérique standard, il n'y a pas de différence. Cependant, si votre entrée commence par un nombre puis contient d'autres caractères, parseFloat tronque le nombre en dehors de la chaîne, tandis que Number donne NaN (pas un nombre):

parseFloat('1x'); // => 1
Number('1x'); // => NaN

De plus, Number comprend les entrées hexadécimales alors que parseFloat ne comprend pas:

parseFloat('0x10'); // => 0
Number('0x10'); // => 16

Mais Number agit étrangement avec des chaînes vides ou des chaînes ne contenant que des espaces:

parseFloat(''); // => NaN
Number(''); // => 0
parseFloat(' \r\n\t'); // => NaN
Number(' \r\n\t'); // => 0

Dans l’ensemble, je trouve que Number est plus raisonnable; j’utilise donc presque toujours Number personnellement (et vous constaterez que de nombreuses fonctions JavaScript internes utilisent Number ainsi que). Si quelqu'un tape '1x' Je préfère montrer une erreur que de la traiter comme si elle avait tapé '1'. La seule fois où je fais vraiment une exception est lorsque je convertis un style en un nombre, auquel cas parseFloat est utile car les styles se présentent sous une forme semblable à '3px', auquel cas je veux supprimer le 'px' partie et juste obtenir le 3, donc je trouve parseFloat utile ici. Mais en réalité, celui que vous choisissez est à vous et quelles formes de contribution vous souhaitez accepter.

Notez que l’utilisation du _ unaire + opérateur correspond exactement à l'utilisation de Number comme fonction:

Number('0x10'); // => 16
+'0x10'; // => 16
Number('10x'); // => NaN
+'10x'; // => NaN
Number('40'); // => 40
+'40'; // => 40

Donc, d'habitude, je n'utilise que + pour faire court. Tant que vous savez ce que ça fait, je le trouve facile à lire.

260
Nathan Wall

La différence est ce qui se produit lorsque l'entrée n'est pas un "nombre correct". Number retourne NaN tandis que parseFloat analyse "autant que possible". Si elle est appelée sur la chaîne vide Number renvoie 0 tandis que parseFloat retourne NaN.

Par exemple:

Number("") === 0               // also holds for false
isNaN(parseFloat("")) === true // and null

isNaN(Number("32f")) === true
parseFloat("32f") === 32
8
Jon

Dans ces exemples, vous pouvez voir la différence:

Number('') = 0;
Number(false) = 0;
Number('1a') = NaN;

parseFloat('') = NaN;
parseFloat(false) = NaN;
parseFloat('1a') = 1;

parseFloat est un peu plus lent, car il recherche la première apparence d'un nombre dans une chaîne, tandis que le constucteur Nombre crée une nouvelle instance de nombre à partir de chaînes contenant des valeurs numériques avec des espaces ou des valeurs fausses.

P.S. Si vous êtes intéressé par des solutions de conversion de type universelles, vous pouvez lire le post concernant la conversion de type dans mon blog: http://justsimplejs.blogspot.com/2012/08/data-type-conversion.html

4
micnic

Pour une chaîne vide, ils sont différents.

+"" Et Number("") renvoie 0, tandis que parseFloat("") renvoie NaN.

2
xdazz

Autant que je sache, et ceci n’a été entendu que par des collègues, parseFloat est peut-être tout à fait mal informé, mais est légèrement plus rapide.

Bien que des recherches plus approfondies soient effectuées, il semblerait que cette différence de performances dépende du navigateur.

http://jsperf.com/parseint-vs-parsefloat/6

Jetez un coup d'oeil à ces résultats de jsPerf et faites-vous appeler. (il comprend aussi + x tests)

Comme indiqué dans la réponse de @xdazz, +"" Et Number("") retournent 0 Tandis que parseFloat("") renvoie NaN alors je reviendrais avec parseFloat, car une chaîne vide ne signifie PAS le nombre 0, seule une chaîne avec le caractère "0" dans cela signifie 0;

2
Christopher