Ce qui est mieux?
Je demande cela juste pour raser quelques octets, car je peux utiliser + x au lieu de number (x). Parsefloat fait-il quelque chose de mieux?
javascript
optimization
Namanyay Goel
la source
la source
Réponses:
La différence entre parseFloat et Number
parseFloat
/parseInt
est pour analyser une chaîne, tandis queNumber
/+
est pour forcer une valeur à un nombre. Ils se comportent différemment. Mais regardons d'abord où ils se comportent de la même manière: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 et contient ensuite d'autres caractères,
parseFloat
tronque le nombre hors de la chaîne, tandis queNumber
donneNaN
(pas un nombre):De plus,
Number
comprend l'entrée hexadécimale alorsparseFloat
que ne:Mais
Number
agit bizarrement avec des chaînes vides ou des chaînes contenant uniquement un espace blanc:Dans l'ensemble, je trouve que
Number
c'est plus raisonnable, donc j'utilise presque toujoursNumber
personnellement (et vous constaterez que beaucoup de fonctions JavaScript internes l'utilisentNumber
également). Si quelqu'un tape,'1x'
je préfère afficher une erreur plutôt que de la traiter comme s'il avait tapé'1'
. Le seul moment où je fais vraiment une exception, c'est lorsque je convertis un style en un nombre, auquel casparseFloat
c'est utile car les styles se présentent sous une forme comme'3px'
, auquel cas je veux supprimer la'px'
pièce et simplement obtenir le3
, donc je trouveparseFloat
utile ici. Mais vraiment, celui que vous choisissez dépend de vous et des formes d'entrée que vous souhaitez accepter.Notez que l'utilisation de l'
+
opérateur unaire est exactement la même chose que l'utilisationNumber
comme fonction:Donc, je l'utilise généralement
+
pour faire court. Tant que vous savez ce qu'il fait, je le trouve facile à lire.la source
Number()
comme "bizarre" Je le considérerais même comme plus attendu, l'espace blanc est une valeur vide mais ce n'est pas nul / non défini => 0 est un bon résultat. Gros (+) pour vous pour les vitrines quand même :)Number('Infinity') === Infinity
alorsparseInt('Infinity') === NaN
+
(unaire plus) pour cela, car si vous oubliez un point-virgule sur la ligne précédente, une expression d'addition pourrait être évaluée à la place.La différence est ce qui se produit lorsque l'entrée n'est pas un "nombre correct".
Number
retourneNaN
tout enparseFloat
analysant "autant que possible". Si elle est appelée, la chaîne videNumber
retourne0
tandis que parseFloat retourneNaN
.Par exemple:
la source
NaN != NaN
cependantNaN != NaN
évalue VRAI - merci pour le conseil!isNaN(NaN)
renvoietrue
Dans ces exemples, vous pouvez voir la différence:
parseFloat est un peu plus lent car il recherche la première apparition d'un nombre dans une chaîne, tandis que le constucteur de nombre crée une nouvelle instance de nombre à partir de chaînes contenant des valeurs numériques avec des espaces ou contenant de fausses valeurs.
PS Si vous êtes intéressé par certaines solutions de conversion de type universelles, vous pouvez lire l'article sur la conversion de type dans mon blog: http://justsimplejs.blogspot.com/2012/08/data-type-conversion.html
la source
Pour une chaîne vide, ils sont différents.
+""
etNumber("")
renvoie 0, tandis queparseFloat("")
renvoie NaN.la source
parseFloat()
a le bon résultat car une chaîne vide n'est PAS le nombre0
(lire: NaN) alors qu'une chaîne avec le caractère"0"
est0
;+x
renvoie0
non seulement pour une chaîne vide mais également pour toute chaîne contenant uniquement des espaces. Exemples:+" "
,+"\t\t\t"
,+"\n\n"
- tous donnent0
comme résultatAutant que je sache, et cela n'a été entendu que par des collègues et pourrait donc être entièrement mal informé, que parseFloat est légèrement plus rapide.
Bien que lors de recherches plus approfondies, il semblerait que cette différence de performances dépende du navigateur.
http://jsperf.com/parseint-vs-parsefloat/6
Jetez un œil à ces résultats jsPerf et passez un appel. (il comprend également + x tests)
Comme indiqué dans la réponse de @xdazz,
+""
etNumber("")
return0
whileparseFloat("")
renvoieNaN
donc Encore une fois, j'irais avec parseFloat, car une chaîne vide ne signifie PAS le nombre 0, seule une chaîne avec le caractère"0"
signifie 0;la source
parseFloat()
est toujours le gagnant.