Existem pelo menos 5 maneiras de fazer isso:
Se você deseja converter apenas em números inteiros, outra maneira rápida (e curta) é a não-bit a bit duplo (ou seja, usando dois caracteres til):
por exemplo
~~x;
Referência: http://james.padolsey.com/cool-stuff/double-bitwise-not/
As 5 maneiras comuns que conheço até agora para converter uma string em um número têm suas diferenças (existem mais operadores bit a bit que funcionam, mas todos dão o mesmo resultado ~~). Este JSFiddle mostra os diferentes resultados que você pode esperar no console de depuração: 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);
}
Console de depuração:
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
A ~~xversão resulta em um número em "mais" casos, onde outros geralmente resultam undefined, mas falha na entrada inválida (por exemplo, retornará 0se a sequência contiver caracteres não numéricos após um número válido).
Transbordar
Observe: Excesso de número inteiro e / ou truncamento de bits podem ocorrer com ~~, mas não as outras conversões. Embora seja incomum digitar valores tão grandes, você precisa estar ciente disso. Exemplo atualizado para incluir valores muito maiores.
Alguns testes Perf indicam que o padrão parseInte as parseFloatfunções são, na verdade, as opções mais rápidas, presumivelmente altamente otimizadas pelos navegadores, mas tudo depende da sua exigência, pois todas as opções são rápidas o suficiente : http://jsperf.com/best-of-string-to -número-conversão / 37
Tudo isso depende de como os testes perf são configurados, pois alguns mostram que parseInt / parseFloat é muito mais lento.
Minha teoria é:
- Mentiras
- Linhas danadas
- Estatisticas
- Resultados JSPerf :)