Hay al menos 5 formas de hacer esto:
Si desea convertir solo a enteros, otra forma rápida (y corta) es el doble bit a bit (es decir, usando dos caracteres tilde):
p.ej
~~x;
Referencia: http://james.padolsey.com/cool-stuff/double-bitwise-not/
Las 5 formas comunes que conozco hasta ahora para convertir una cadena en un número tienen sus diferencias (hay más operadores bit a bit que funcionan, pero todos dan el mismo resultado que ~~). Este JSFiddle muestra los diferentes resultados que puede esperar en la consola de depuración: http://jsfiddle.net/TrueBlueAussie/j7x0q0e3/22/
var values = ["123",
undefined,
"not a number",
"123.45",
"1234 error",
"2147483648",
"4999999999"
];
for (var i = 0; i < values.length; i++){
var x = values[i];
console.log(x);
console.log(" Number(x) = " + Number(x));
console.log(" parseInt(x, 10) = " + parseInt(x, 10));
console.log(" parseFloat(x) = " + parseFloat(x));
console.log(" +x = " + +x);
console.log(" ~~x = " + ~~x);
}
Consola de depuración:
123
Number(x) = 123
parseInt(x, 10) = 123
parseFloat(x) = 123
+x = 123
~~x = 123
undefined
Number(x) = NaN
parseInt(x, 10) = NaN
parseFloat(x) = NaN
+x = NaN
~~x = 0
null
Number(x) = 0
parseInt(x, 10) = NaN
parseFloat(x) = NaN
+x = 0
~~x = 0
"not a number"
Number(x) = NaN
parseInt(x, 10) = NaN
parseFloat(x) = NaN
+x = NaN
~~x = 0
123.45
Number(x) = 123.45
parseInt(x, 10) = 123
parseFloat(x) = 123.45
+x = 123.45
~~x = 123
1234 error
Number(x) = NaN
parseInt(x, 10) = 1234
parseFloat(x) = 1234
+x = NaN
~~x = 0
2147483648
Number(x) = 2147483648
parseInt(x, 10) = 2147483648
parseFloat(x) = 2147483648
+x = 2147483648
~~x = -2147483648
4999999999
Number(x) = 4999999999
parseInt(x, 10) = 4999999999
parseFloat(x) = 4999999999
+x = 4999999999
~~x = 705032703
La ~~xversión da como resultado un número en "más" casos, donde otros a menudo dan como resultado undefined, pero falla por una entrada no válida (por ejemplo, regresará 0si la cadena contiene caracteres que no son números después de un número válido).
Desbordamiento
Tenga en cuenta: puede ocurrir un desbordamiento de enteros y / o truncamiento de bits ~~, pero no con las otras conversiones. Si bien es inusual ingresar valores tan grandes, debe ser consciente de esto. Ejemplo actualizado para incluir valores mucho más grandes.
Algunas pruebas de rendimiento indican que el estándar parseInty las parseFloatfunciones son en realidad las opciones más rápidas, presumiblemente altamente optimizadas por los navegadores, pero todo depende de sus requisitos, ya que todas las opciones son lo suficientemente rápidas : http://jsperf.com/best-of-string-to -conversión-número / 37
Todo esto depende de cómo se configuren las pruebas de rendimiento, ya que algunos muestran que parseInt / parseFloat es mucho más lento.
Mi teoría es:
- Mentiras
- Líneas malditas
- Estadísticas
- Resultados JSPerf :)