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?
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.
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
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
Pour une chaîne vide, ils sont différents.
+""
Et Number("")
renvoie 0, tandis que parseFloat("")
renvoie NaN.
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;