2010-11-03 20 views

Respuesta

324

Bueno, ellos son semánticamente diferente, los Number constructor called as a function realiza tipo de conversión y parseInt realiza análisis sintáctico, por ejemplo:

// parsing: 
parseInt("20px");  // 20 
parseInt("10100", 2); // 20 
parseInt("2e1");  // 2 

// type conversion 
Number("20px");  // NaN 
Number("2e1");  // 20, exponential notation 

Tenga en cuenta que si parseInt detecta un cero en la cuerda, Analizará el número en la base octal, esto ha cambiado en ECMAScript 5, la nueva versión del estándar, pero tomará mucho tiempo entrar en las implementaciones del navegador (es una incompatibilidad con ECMAScript 3), también parseInt wil Ignore los caracteres finales que no se corresponden con ningún dígito de la base utilizada actualmente.

El constructor Number no detecta octales:

Number("010");   // 10 
parseInt("010");  // 8, implicit octal 
parseInt("010", 10); // 10, decimal radix used 

Pero puede manejar números en notación hexadecimal, al igual que parseInt:

Number("0xF"); // 15 
parseInt("0xF"); //15 

Además, una construcción ampliamente utilizado para llevar a cabo numérico tipo de conversión, es el Unary + Operator (p. 72), es equivalente a usar el constructor Number como una función:

+"2e1"; // 20 
+"0xF"; // 15 
+"010"; // 10 
+0

Interesante, ¿no ignora parseInt los caracteres que siguen al número? Porque en mi caso preferiría obtener un NaN en lugar de los 20 al convertir. – Mark

+0

Sí lo hace. Parece que definitivamente quieres Number() – Gareth

+0

Bien, entonces creo que iré con Number() pero muchas gracias por aclarar este punto y todos estos ejemplos! :-) – Mark

4

Siempre uso parseInt, pero tenga cuidado con los ceros a la izquierda que lo forzarán a modo octal.

+29

Creo que siempre es una buena idea proporcionar una base para 'parseInt (value, radix)' de esa manera no tiene conversiones accidentales * modo octal *, etc. – awesomo

+0

Ceros a la izquierda * lo forzará a modo octal en ECMAScript 3. ECMAScript 5 lo analizará en '0', incluso en modo no estricto. Pero esto se ha solucionado y ahora los ceros a la izquierda se ignoran, por lo que 'parseInt (" 070 ")' se convertiría en '70'. –

+0

También debería usar un linter que le advierta que proporcione un valor de raíz en 'parseInt()'. – Justin

14
typeof parseInt("123") => number 
typeof Number("123") => number 
typeof new Number("123") => object (Number primitive wrapper object) 

primero dos le dará mejor rendimiento ya que devuelve una primitiva en lugar de un objeto.

+0

Ah, veo Number (someString) significa que paso una cadena a su constructor y obtengo un objeto a cambio. – Mark

+17

'new Number()' es diferente a 'Number()'. 'Número typeof ("123") => number' – Gareth

+0

creo que este es uno de los puntos más importantes a tomar nota desde el punto de vista del rendimiento, como objetos consumen mucha más memoria y tiempo de procesamiento. Buena discusión de ustedes dos, letronje y Gareth. – Dave

14

Si está buscando el rendimiento, entonces probablemente los mejores resultados lo obtendrá con el desplazamiento a la derecha en el bit "10">>0. También multiplique ("10" * 1) o no (~~"10"). Todos ellos son mucho más rápidos de Number y parseInt. Incluso tienen "característica" que devuelve 0 para el argumento sin número. Aquí están Performance tests.

+1

La velocidad de los diversos los enfoques parecen cambiar con las revisiones del navegador a lo largo del tiempo. La prueba ligado también ha cambiado, y la última versión de este comentario es aquí - http://jsperf.com/number-vs-parseint-vs-plus/39 - afortunadamente, el sitio contiene versiones anteriores de la prueba, así – bobo

+0

@bobo, seguro. Por curiosidad, verificó con chrome - 'Number' y' parseInt' aún más lento el 99% que el resto. Además, para mí también son menos atractivos visualmente :-) – Saulius

+0

@Saulius menos atractivo visualmente, pero mucho más compatible con Google :) – jackweirdy

1

parseInt convierte a un número entero, es decir, que las tiras decimales. El número no se convierte a entero.

Cuestiones relacionadas