2009-02-27 27 views
9

En primer lugar - mi descripción;)parseInt alternativa

Tengo una respuesta JSON de XmlHttpRequests del servidor. El controlador MySQL genera todos los datos como cadena y PHP lo devuelve tal como está, por lo que cualquier entero se devuelve como cadena, por lo tanto:

¿Existe alguna alternativa rápida (hack) para la función parseInt() en JS que puede analizar números puros cadena, por ejemplo

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

¿qué ocurre con int = string * 1? – dusoft

+0

bueno, también funciona para carrozas. – KooiInc

+0

No hay necesidad de multiplicar. Usar el operador unario: int = + cadena; (Sin embargo, cada número en javascript sigue siendo flotante (pero creo que escuché que el V8 podría tener algunas optimizaciones y realmente usar ints) – some

Respuesta

35

Convertir en un número entero simplemente utilizar el operador unario +, debe ser la forma más rápida:

var int = +string; 

conversiones a otros tipos se pueden hacer de una manera similar:

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

More info .

+0

¡Esta es una idea inteligente, gracias! Me gusta dusoft es multiplican demasiado – shfx

+1

En Chrome, parseInt() es más rápido: http://cl.ly/image/442b10002i3T Si explica el hecho de que usted necesita para comprobar si hay isNaN con parseInt y el operador unario, el doble tilde es más rápido que unario, pero parseInt todavía gana en Chrome. En IE, la doble tilde gana. Ver: http://jsperf.com/double-tilde-vs-parseint/6 –

+0

Gracias salvó mi día – Brent

8

En primer lugar, ¿ha documentado que es lento y está causando problemas? De lo contrario, no me molestaría en buscar una solución, porque realmente no hay ningún problema.

En segundo lugar, supongo que dado que parseInt es un método JS nativo, se implementaría de una manera muy rápida, y probablemente en el idioma nativo de la VM (probablemente C, dependiendo del navegador/VM) Creo que podrías tener algunos problemas para hacer un método más rápido con JS puro. =)

Por supuesto, no soy un gurú de JS, así que no estoy seguro, pero esto es lo que mi intuición me dice, y tiende a ser la respuesta estándar a "¿cómo podría hacer una más rápida? alternativa para libraryFunction()? " preguntas

+1

Hay otras razones para no usar parseInt - comparar parseInt ("07") a parseInt ("08") –

+2

que estaría usted debe utilizar parseInt ("07", 10) –

2

El constructor número también existe, pero debe ser el mismo que parseInt en términos de velocidad (como ya se ha dicho que debe corregir la parte PHP en lugar del Javascript de todos modos):

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

Por cierto si alguien Me interesó buscar por curiosidad para la implementación V8 (Google Chrome) de parseInt y es here on google code.

+1

caer el 'new', el uso 'i = Number (i)' en su lugar para obtener una primitiva en lugar de un objeto – Christoph

+0

Exacto, lo agregaré. Gracias. –

6

echarlo a un int en PHP antes de json_encode() que:

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

Por cierto, al usar parseInt es una buena práctica especificar siempre el segundo parámetro a menos que realmente desea cadena que comienza con 0, debe interpretarse en octal y así sucesivamente:

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

Es complicado, no tengo acceso al servidor Php. – shfx

2

Usted no se va a conseguir mejor que parseInt, pero el error real es que el PHP está proporcionando lo que se supone que es un número como una cadena.

Y lo mismo que dijo Daniel: no busques micro-optimizaciones como esta hasta que hayas analizado tu código y descubras que vale la pena hacerlo.

0

si los objetos son más grandes puede probar JSON, es un formato mecanografiado por lo que no necesita convertir los valores.

0

¿Qué tan lento puede ser? ¿Cuántas veces por segundo se llama este proceso? ¿Cuántos valores diferentes de retorno numérico hay? Arreglé un guión y probé 100.000 números. Analizarlos de cadenas tomó 687ms. Buscarlos en una matriz tomó 541ms. Esa es una mejora muy pequeña. Estoy de acuerdo con otros carteles. Es posible que no seas mejor que el método nativo parseInt().

12

Tipo de calidad en JavaScript se realiza a través de las funciones constructoras de la incorporada en los tipos sin new, es decir

foo.bar = Number(foo.bar); 

Esto difiere de parseInt() de varias maneras:

  • ceros a la izquierda ganaron 'modo octal gatillo t
  • valores de coma flotante se analizará así
  • toda la serie se analiza, es decir, si contiene caracteres no numéricos adicionales, el valor de retorno será NaN
0

Casting es un poquito más rápido que el análisis pero más lento que busca.

Además, en Firefox el método más rápido resulta ser parseInt() seguido de la búsqueda. Firefox también resultó ser 6 veces más rápido en promedio que IE. Interesante.

Cool idea usando el operador unario. En Firefox que resultó ser comparable a parseInt(). En IE, resultó ser el método más rápido.

1

acceso directo rápido a parseInt es

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

Esto es lo que ASM utiliza para representar enteros en js.

+0

esto es malo ''1234567890123' | 0' -> ' 1912276171' – Kokizzu

+1

Oh sí. Hacer que funcione como un entero te da la posibilidad de un desbordamiento de enteros. –