在JavaScript中将字符串转换为数字的最快方法是什么?~~x;

2022-08-30 04:34:48

任何数字,它就是数字。字符串看起来像一个数字,它是数字。其他一切,它都是NaN。

'a' => NaN
'1' => 1
1 => 1

答案 1

据我所知,有4种方法可以做到这一点。

Number(x);
parseInt(x, 10);
parseFloat(x);
+x;

通过我所做的这个快速测试,它实际上取决于浏览器。

https://jsben.ch/NnBKM

Implicit在3个浏览器上标记为最快的,但它使代码难以阅读...所以选择任何你喜欢的东西!


答案 2

至少有5种方法可以做到这一点:

如果您只想转换为整数,另一种快速(和简短)的方法是双按位不(即使用两个波浪号字符):

例如:

~~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

版本在“更多”情况下产生一个数字,其中其他通常导致 ,但由于输入无效而失败(例如,如果字符串在有效数字包含非数字字符,它将返回)。~~xundefined0

溢出

请注意:整数溢出和/或位截断可能发生在 中,但其他转换不会发生。虽然输入如此大的值是不寻常的,但您需要注意这一点。更新了示例以包含更大的值。~~

一些Perf测试表明,标准和功能实际上是最快的选项,可能是浏览器高度优化的,但这完全取决于您的要求,因为所有选项都足够快http://jsperf.com/best-of-string-to-number-conversion/37parseIntparseFloat

这完全取决于perf测试的配置方式,因为有些测试显示parseInt/parseFloat要慢得多。

我的理论是:

  • 谎言
  • 达恩线
  • 统计学
  • JSPerf 结果:)