至少有 5 种方法可以做到这一点:
如果您只想转换为整数,另一种快速(且简短)的方法是 double-bitwise not(即使用两个波浪号):
例如
~~x;
参考:http://james.padolsey.com/cool-stuff/double-bitwise-not/
到目前为止,我所知道的将字符串转换为数字的 5 种常用方法都有其不同(还有更多的按位运算符有效,但它们都给出与 ~~ 相同的结果)。此 JSFiddle 显示了您在调试控制台中可以预期的不同结果: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);
}
调试控制台:
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
~~x 版本在“更多”情况下会产生一个数字,而其他人通常会产生undefined,但它会因无效输入而失败(例如,如果字符串包含非数字字符,它将返回0 em>在一个有效数字之后)。
溢出
请注意:~~ 可能会发生整数溢出和/或位截断,但不会发生其他转换。虽然输入如此大的值并不常见,但您需要注意这一点。更新示例以包含更大的值。
一些 Perf 测试表明,标准的 parseInt 和 parseFloat 函数实际上是最快的选项,可能已被浏览器高度优化,但这完全取决于您的要求,因为 所有 选项都是 足够快:http://jsperf.com/best-of-string-to-number-conversion/37
这完全取决于性能测试的配置方式,因为某些显示 parseInt/parseFloat 的速度要慢得多。
我的理论是: