2009-02-27 8 views
9

Premièrement - ma description;)parseInt alternative

J'ai une réponse JSON XmlHttpRequests du serveur. Le pilote MySQL affiche toutes les données sous forme de chaîne et PHP le renvoie tel quel, donc tout entier est renvoyé sous forme de chaîne, donc:

Y a-t-il une alternative rapide (hack) pour la fonction parseInt() dans JS qui peut analyser pure numeric chaîne, par exemple

var foo = {"bar": "123"}; 
... 
foo.bar = parseInt(foo.bar); // (int) 123 
+1

qu'en est-il de int = string * 1? – dusoft

+0

sympa, fonctionne aussi pour les flotteurs. – KooiInc

+0

Pas besoin de multiplier. Utilisez l'opérateur unaire: int = + string; (Cependant, chaque numéro en javascript est toujours un flottant (mais je pense que j'ai entendu dire que V8 pourrait avoir des optimisations et utiliser réellement ints) – some

Répondre

35

Pour convertir un nombre entier il suffit d'utiliser l'opérateur unaire +, il devrait être le moyen le plus rapide:

var int = +string; 

conversions à d'autres types peuvent être effectués de manière similaire:

var string = otherType + ""; 
var bool = !!anything; 

More info .

+0

C'est une idée géniale, merci! J'aime la multiplication de dusoft aussi – shfx

+1

Dans Chrome, parseInt() est le plus rapide: http://cl.ly/image/442b10002i3T Si vous tenez compte du fait que vous devez vérifier isNaN avec parseInt et l'opérateur unaire, le double tilde est plus rapide que unaire, mais parseInt gagne toujours dans Chrome. Dans IE, double tilde gagne. Voir: http://jsperf.com/double-tilde-vs-parseint/6 –

+0

Merci d'avoir sauvegardé ma journée – Brent

8

Tout d'abord, avez-vous réellement documenté que c'est lent et cause des problèmes? Sinon, je ne chercherais pas une solution, car il n'y a vraiment pas de problème. Deuxièmement, je suppose que puisque parseInt est une méthode JS native, elle serait implémentée de manière très rapide, et probablement dans la langue maternelle de la VM (probablement C, selon le navigateur/VM)). Je pense que vous pourriez avoir du mal à faire une méthode plus rapide de pure JS. =)

Bien sûr, je ne suis pas un gourou JS, donc je ne sais pas avec certitude, mais c'est ce que mon intuition me dit, et tend à être la réponse standard à "Comment pourrais-je faire un plus rapide alternative pour libraryFunction()? " des questions.

+1

Il existe d'autres raisons de ne pas utiliser parseInt - comparer parseInt ("07") à parseInt ("08") –

+2

que vous devriez utiliser parseInt ("07", 10) –

2

Le constructeur numéro existe également, mais il devrait être le même que celui parseInt en terme de vitesse (comme cela a déjà dit que vous devez corriger la partie PHP au lieu de celui javascript de toute façon):

var i = "123"; 
i = new Number(i); // Number numeric wrapper 
var j = "123"; 
j = Number(j); // Number primitive 

BTW si quelqu'un Je suis intéressé, j'ai cherché par curiosité pour l'implémentation V8 (Google Chrome) de parseInt et c'est here on google code.

+1

supprimer le 'new', utiliser 'i = Number (i)' à la place pour obtenir une primitive au lieu d'un objet – Christoph

+0

Exact, je vais l'ajouter. Merci. –

6

Cast à un int en PHP avant json_encode() il:

$foo->bar = (int)$foo->bar; 
print('var foo = ' . json_encode($foo)); 

Soit dit en passant, lors de l'utilisation parseInt il est bon de toujours spécifier le second paramètre, sauf si vous voulez vraiment chaîne commençant par 0 à interpréter comme octal et ainsi de suite:

parseInt('010', 10); // 10 
+0

C'est compliqué, je n'ai pas accès au serveur Php. – shfx

2

Vous n'allez pas faire mieux que parseInt, mais le vrai bogue est que le PHP fournit ce qui est censé être un nombre comme une chaîne.

Et d'après ce que Daniel a dit - ne cherchez pas des micro-optimisations comme celle-ci tant que vous n'avez pas comparé votre code et découvert que cela vaut la peine de le faire.

0

Si les objets sont plus gros, vous pouvez essayer JSON, il s'agit d'un format dactylographié de sorte que vous n'avez pas besoin de convertir les valeurs.

0

À quel point peut-il être lent? Combien de fois par seconde ce processus est-il appelé? Combien y a-t-il de valeurs de retour numériques différentes? J'ai assemblé un script et testé 100 000 numéros. Les analyser à partir de chaînes a pris 687ms. Les rechercher dans un tableau a pris 541ms. C'est une très petite amélioration. Je suis d'accord avec d'autres affiches. Vous ne pouvez pas obtenir mieux que la méthode natif parseInt().

12

transtypage en JavaScript se fait via les fonctions de constructeur de types intégrés sans new, à savoir

foo.bar = Number(foo.bar); 

Ceci diffère de parseInt() de plusieurs façons:

  • des zéros non significatifs ont gagné Ne déclenchez pas le mode octal
  • les valeurs à virgule flottante seront également analysées
  • toute la chaîne est analysée, à savoir si elle contient des caractères non numériques supplémentaires, la valeur de retour sera NaN
0

Le casting est un petit peu plus vite que l'analyse syntaxique, mais plus lent que la recherche.

De même, dans Firefox, la méthode la plus rapide s'avère être parseInt() suivie d'une recherche. Firefox s'est avéré être 6 fois plus rapide en moyenne que IE. Intéressant.

Idée cool en utilisant l'opérateur unaire. Dans Firefox, il s'est avéré être comparable à parseInt(). Dans IE, il s'est avéré être la méthode la plus rapide.

1

raccourci rapide vers parseInt est

("78.5" | 0) //bitwise or forces the string to parse as int 

C'est ce que ASM utilise pour représenter ints en js.

+0

c'est mauvais '' 123456789'' 0' -> '1912276171' – Kokizzu

+1

Oh ouais. Le faire fonctionner comme un nombre entier vous donne la possibilité de débordement d'entier. –