Quelles sont les différences entre cette ligne:
var a = parseInt("1", 10); // a === 1
et cette ligne
var a = +"1"; // a === 1
Ce test jsperf montre que l'opérateur unaire est beaucoup plus rapide dans la version actuelle de chrome, en supposant que ce soit pour node.js !?
Si j'essaie de convertir des chaînes qui ne sont pas des nombres, les deux renvoient NaN
:
var b = parseInt("test" 10); // b === NaN
var b = +"test"; // b === NaN
Alors, quand devrais-je préférer utiliser parseInt
le plus unaire (en particulier dans node.js) ???
edit : et quelle est la différence avec l'opérateur double tilde ~~
?
javascript
node.js
ici et maintenant78
la source
la source
Réponses:
Veuillez consulter cette réponse pour un ensemble plus complet de cas
Eh bien, voici quelques différences que je connais:
Une chaîne vide
""
évalue à a0
, tandis que l'parseInt
évalue àNaN
. IMO, une chaîne vide doit être unNaN
.L'unaire
+
agit plus commeparseFloat
puisqu'il accepte également les décimales.parseInt
d'autre part, arrête l'analyse quand il voit un caractère non numérique, comme le point qui est censé être un point décimal.
.parseInt
etparseFloat
analyse et construit la chaîne de gauche à droite . S'ils voient un caractère invalide, il renvoie ce qui a été analysé (le cas échéant) comme un nombre, etNaN
si aucun n'a été analysé comme un nombre.L'unaire,
+
en revanche, retourneraNaN
si la chaîne entière n'est pas convertible en nombre.Comme vu dans le commentaire de @Alex K. ,
parseInt
etparseFloat
analysera par caractère. Cela signifie que les notations hexadécimales et exposantes échoueront car lesx
ete
sont traités comme des composants non numériques (au moins sur base10).+
Cependant, l' unaire les convertira correctement.la source
+"0xf" != parseInt("0xf", 10)
Math.floor()
, qui coupe essentiellement la partie décimale."2e3"
n'est pas une représentation entière valide pour2000
. C'est un nombre à virgule flottante valide cependant:parseFloat("2e3")
donnera correctement2000
la réponse. Et"0xf"
nécessite au moins la base 16, c'est pourquoiparseInt("0xf", 10)
renvoie0
, alors queparseInt("0xf", 16)
renvoie la valeur de 15 que vous attendiez.Math.floor(-3.5) == -4
et~~-3.5 == -3
.La table de conversion ultime quel que soit en nombre:
Afficher l'extrait de code
la source
"NaN"
à ce tableau.isNaN
colonne à cette table: par exemple,isNaN("")
est faux (c'est-à-dire qu'il est considéré comme un nombre), maisparseFloat("")
estNaN
, ce qui peut être un piège, si vous essayez d'utiliserisNaN
pour valider l'entrée avant de la passer àparseFloat
'{valueOf: function(){return 42}, toString: function(){return "56"}}'
à la liste. Les résultats mitigés sont intéressants.+
c'est juste une façon d'écrire plus courteNumber
, et les plus éloignées sont juste des façons folles de le faire qui échouent sur les cas extrêmes?Je pense que le tableau de la réponse de thg435 est complet, mais nous pouvons le résumer avec les modèles suivants:
true
à 1, mais"true"
àNaN
.parseInt
est plus libéral pour les chaînes qui ne sont pas de purs chiffres.parseInt('123abc') === 123
, tandis que les+
rapportsNaN
.Number
acceptera des nombres décimaux valides, alorsparseInt
que tout simplement abandonne tout au-delà de la décimale. AinsiparseInt
imite le comportement C, mais n'est peut-être pas idéal pour évaluer les entrées de l'utilisateur.parseInt
, étant un analyseur mal conçu , accepte les entrées octales et hexadécimales. Unary plus ne prend que hexadécimal.Les valeurs fausses sont converties en
Number
suivant ce qui aurait du sens dans C:null
etfalse
sont toutes les deux nulles.""
aller à 0 ne suit pas tout à fait cette convention mais me semble assez logique.Par conséquent, je pense que si vous validez l'entrée de l'utilisateur, unary plus a un comportement correct pour tout sauf qu'il accepte les décimales (mais dans mes cas réels, je suis plus intéressé par la capture de l'entrée d'e-mail au lieu de userId, valeur entièrement omise, etc.), alors que parseInt est trop libéral.
la source
Attention, parseInt est plus rapide que l'opérateur unaire + dans Node.JS, il est faux que + ou | 0 sont plus rapides, ils ne le sont que pour les éléments NaN.
Regarde ça:
la source
Pensez également aux performances . J'ai été surpris que cela
parseInt
bat unaire plus sur iOS :) Ceci n'est utile que pour les applications Web avec une forte consommation de processeur. En règle générale, je suggérerais à JS opt-guys de considérer n'importe quel opérateur JS plutôt qu'un autre du point de vue des performances mobiles de nos jours.Alors, passez d'abord au mobile ;)
la source