在JavaScript中将字符串转换为数字的最快方法是什么?~~x;
2022-08-30 04:34:48
任何数字,它就是数字。字符串看起来像一个数字,它是数字。其他一切,它都是NaN。
'a' => NaN
'1' => 1
1 => 1
任何数字,它就是数字。字符串看起来像一个数字,它是数字。其他一切,它都是NaN。
'a' => NaN
'1' => 1
1 => 1
据我所知,有4种方法可以做到这一点。
Number(x);
parseInt(x, 10);
parseFloat(x);
+x;
通过我所做的这个快速测试,它实际上取决于浏览器。
Implicit
在3个浏览器上标记为最快的,但它使代码难以阅读...所以选择任何你喜欢的东西!
如果您只想转换为整数,另一种快速(和简短)的方法是双按位不(即使用两个波浪号字符):
例如:
~~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
请注意:整数溢出和/或位截断可能发生在 中,但其他转换不会发生。虽然输入如此大的值是不寻常的,但您需要注意这一点。更新了示例以包含更大的值。~~
一些Perf测试表明,标准和功能实际上是最快的选项,可能是浏览器高度优化的,但这完全取决于您的要求,因为所有选项都足够快:http://jsperf.com/best-of-string-to-number-conversion/37parseInt
parseFloat
这完全取决于perf测试的配置方式,因为有些测试显示parseInt/parseFloat要慢得多。