Qui est le meilleur, le nombre(x) ou parseFloat(x)?
Ce qui est mieux?
Je vous pose cette question juste pour le plaisir de gagner quelques octets, car je peux l'utiliser +x à la place de(x). Ne parsefloat faire quelque chose de mieux?
- Seule la précision des nombres à virgule flottante occuper de 4 octets dans un système 32 bits ainsi que simple entiers. Je ne sais pas comment javascript poignées de flotte mais je suppose que c'est à peu près la même.
- Tous les numéros sont en Javascript double précision flotteurs.
- Je wouldve voté pour cette question si ce n'était pas pour le MODIFIER segment
Vous devez vous connecter pour publier un commentaire.
La différence entre parseFloat et le Nombre
parseFloat
/parseInt
est pour l'analyse d'une chaîne de caractères, alors queNumber
/+
est pour le fait de contraindre une valeur à un certain nombre. Ils se comportent différemment. Mais d'abord, regardons où ils se comportent de la même:Donc, tant que vous avez de la norme d'entrée numérique, il n'y a pas de différence. Toutefois, si votre entrée commence par un nombre, puis contient d'autres caractères,
parseFloat
tronque le numéro de la chaîne, tandis queNumber
donneNaN
(pas un nombre):En outre,
Number
comprend hexadécimal d'entrée tout enparseFloat
n':Mais
Number
actes bizarre avec des chaînes vides ou des chaînes de caractères ne contenant que des espaces blancs:Sur l'ensemble, je trouve
Number
être plus raisonnable, j'ai donc presque toujours utiliserNumber
personnellement (et vous verrez que beaucoup de l'intérieur de fonctions JavaScript à utiliserNumber
ainsi). Si quelqu'un tape'1x'
je préfère afficher une erreur plutôt que de les traiter comme si elles avaient tapé'1'
. La seule fois où j'ai vraiment faire une exception, c'est quand je suis la conversion d'un style à un certain nombre, auquel casparseFloat
est utile parce que les styles viennent dans une forme comme'3px'
, auquel cas je souhaite supprimer le'px'
partie et qui vient d'obtenir l'3
, donc je trouveparseFloat
utile ici. Mais vraiment celui que vous choisissez est à vous et les formes d'entrée que vous souhaitez accepter.Notez que l'utilisation de l'unaire
+
opérateur est exactement le même que l'utilisation deNumber
en fonction:Donc j'ai l'habitude de simplement utiliser
+
pour faire court. Aussi longtemps que vous savez ce qu'il fait, je le trouve facile à lire.parseFloat
sur un certain nombre convertit le nombre en premier dans une chaîne, puis analyse d'une chaîne.Number
ignore que l'aller-retour. Peut-il y avoir un cas où un tel aller-retour sera une perte de précision? Je ne sais pas.parseInt('1e10')
(qui renvoie1
) et supposéparseFloat
se comportaient de la même manière. Merci pour la correction!Number()
comme "bizarre", je dirais même le considérer plus comme prévu, une espace est une valeur vide, mais il n'est pas null/undefined => 0 est un joli résultat. Gros (+) pour vous pour les vitrines de toute façon 🙂Number('Infinity') === Infinity
alors queparseInt('Infinity') === NaN
+
(unaire plus) pour cela, parce que si vous oubliez un point-virgule à la ligne précédente, un ajout de l'expression peut être évaluée à la place.La différence de ce qui se passe lorsque l'entrée n'est pas un "bon numéro".
Number
retourneNaN
toutparseFloat
analyse "autant qu'il le peut". Si elle est appelée sur la chaîne videNumber
retourne0
tout parseFloat retourneNaN
.Par exemple:
NaN != NaN
siNaN != NaN
évalue à TRUE - merci pour l'astuce !isNaN(NaN)
retournetrue
Dans ces exemples, vous pouvez voir la différence:
parseFloat est un peu plus lent, car il recherche d'abord l'apparition d'un nombre en une chaîne de caractères, alors que le Nombre constuctor crée une nouvelle instance du numéro à partir de chaînes de caractères qui contient des valeurs numériques avec des espaces blancs ou qui contient de fausses valeurs.
P. S. Si vous êtes intéressé par certains universelle de conversion de type de solutions, vous pouvez lire le post sur la conversion de type dans mon blog: http://justsimplejs.blogspot.com/2012/08/data-type-conversion.html
Pour la chaîne vide, ils sont différents.
+""
etNumber("")
retourne 0, tandis queparseFloat("")
renvoie NaN.parseFloat()
a le droit de résultat comme une chaîne vide n'est PAS le nombre0
(lire: NaN), tandis qu'une chaîne de caractères avec le caractère"0"
EST0
;+x
retourne0
pas seulement pour une chaîne vide, mais aussi pour n'importe quel espace uniquement des chaînes de caractères. Exemples:+" "
,+"\t\t\t"
,+"\n\n"
- tous d'entre eux donnent des0
la suiteAutant que je sache, et ce n'est entendu de la part des collègues, donc peut être tout à fait mal informés, que parseFloat est légèrement plus rapide.
Bien que sur la poursuite de la recherche, il semblerait que cette différence de performances est un navigateur charge.
http://jsperf.com/parseint-vs-parsefloat/6
Un oeil à ces jsPerf résultats, et vous êtes à l'appel. (il comprend +x tests)
Comme indiqué dans @xdazz 's réponse,
+""
etNumber("")
retour0
toutparseFloat("")
retourneNaN
Encore une fois, je voudrais aller avec parseFloat, car une chaîne vide ne signifie PAS le nombre 0, seulement une chaîne de caractères avec le caractère"0"
dans cela signifie 0;parseFloat()
est toujours le gagnant.