在JavaScript中将String转换为Number的最快方法是什么?

bea*_*tak 117 javascript

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

'a' => NaN
'1' => 1
1 => 1
Run Code Online (Sandbox Code Playgroud)

bea*_*tak 179

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

Number(x);
parseInt(x, 10);
parseFloat(x);
+x;
Run Code Online (Sandbox Code Playgroud)

通过这个快速测试,它实际上取决于浏览器.

http://jsperf.com/best-of-string-to-number-conversion/2

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

  • 有趣的是,谷歌分析(你粘贴到你的网站的部分)使用`1*`进行日期到数字的转换,这类似于上面的`+`.即`1*new Date()`而不是`+ new Date()`.可能它更具可读性? (7认同)
  • @beatak - 当前的优化似乎更倾向于本地方法而不是隐式转换.我在Windows Server 2008 R2/7上的Chrome 37.0.2062.124和Firefox 30.0中的ParseInt()中获得最快的Number(),其中隐含的速度最快.此外,您可以考虑在测试中包含字符串文字浮点数以进行一般比较.我的猜测是它可能会在某些情况下改变顺序,因为字符串到浮点转换通常比字符串到int转换慢.现在的测试方式是,当使用Number()时,它会通过字符串转换为int转换. (4认同)
  • 我认为“1*”是首选,因为它不太容易出错。`+1` 之前不需要的悬空变量不是解析错误。这是一个类似于在“C”中使用“if (MYCONSTANT == myvar)”的技巧。 (2认同)
  • 铬 61.0.3163。Number() 是最快的。 (2认同)

Gon*_*ing 64

至少有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);
}
Run Code Online (Sandbox Code Playgroud)

调试控制台:

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
Run Code Online (Sandbox Code Playgroud)

~~x版本在"更多"情况下产生一个数字,其他情况经常导致undefined,但是无效输入失败(例如,0如果字符串有效数字包含非数字字符,它将返回).

溢出

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

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

这一切都取决于如何配置perf测试,因为有些人显示parseInt/parseFloat要慢得多.

我的理论是:

  • 织补线条
  • 统计
  • JSPerf结果:)

  • 对于大于 2147483647 的数字要非常小心。例如:`~~4294967296` 返回 `0`。 (3认同)

小智 7

将字符串转换为整数的快速方法是使用按位或,如下所示:

x | 0
Run Code Online (Sandbox Code Playgroud)

虽然它取决于它是如何实现的,但理论上它应该相对较快(至少和+x它一样快)因为它将首先x转换为数字然后执行非常有效的或.


Pra*_*eep 5

+运算符前缀字符串。

console.log(+'a') // NaN
console.log(+'1') // 1
console.log(+1) // 1
Run Code Online (Sandbox Code Playgroud)