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

IT技术 javascript
2021-01-15 05:45:24

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

'a' => NaN
'1' => 1
1 => 1
6个回答

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

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

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

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

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

我认为1*是首选,因为它不容易出错。之前不需要的悬空变量+1不是解析错误。这是一个类似于使用if (MYCONSTANT == myvar)in的技巧C
2021-03-21 05:45:24
有趣的是,谷歌分析(你粘贴到网站的部分)1*用于日期到数字的转换,这与+上面的类似1*new Date()而不是+new Date()也许它更具可读性?
2021-03-29 05:45:24
@beatak - 当前的优化似乎有利于本机方法而不是隐式转换。对于 Windows Server 2008 R2 / 7 上的 Chrome 37.0.2062.124 中的 Number() 和 Firefox 30.0 中的 ParseInt(),我的速度最快,隐式是两者中最慢的。此外,您可能会考虑在测试中包含字符串文字浮点数以进行一般比较。我的猜测是在某些情况下它可能会改变顺序,因为字符串到浮点数的转换通常比字符串到整数的转换慢。现在的测试方式是,当使用 Number() 时,它可以将字符串转换为 int 。
2021-04-08 05:45:24
铬 61.0.3163。Number() 是最快的。
2021-04-12 05:45:24
我只是相比Number()~~(只是几运行jsben.ch),并且Number()赢了,虽然有时它几乎均匀。
2021-04-12 05:45:24

至少有 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

~~x版本在“更多”情况下会产生一个数字,而其他情况下通常会产生undefined,但它会因无效输入而失败(例如,0如果字符串有效数字之后包含非数字字符则它将返回)。

溢出

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

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

这一切都取决于性能测试的配置方式,因为某些显示 parseInt/parseFloat 会慢得多。

我的理论是:

  • 谎言
  • 该死的线条
  • 统计数据
  • JSPerf 结果:)
对于大于 2147483647 的数字要非常小心。例如: ~~4294967296返回0
2021-04-03 05:45:24
@JosephGoh:当我有机会时,我会将结果扩展为包括 int 范围溢出。一般来说,如果数字那么大,你有一个非常特殊的界面,所以需要注意溢出。干杯
2021-04-05 05:45:24
@JosephGoh:有趣的是,在 Chrome 中,您不会得到 0,而是会得到超过有符号最大值的负数。然后,当您超过 unsigned int 最大值时,它似乎只是删除了额外的位。例如“4999999999”=> 705032703
2021-04-07 05:45:24

+运算符作为字符串的前缀

console.log(+'a') // NaN
console.log(+'1') // 1
console.log(+1) // 1

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

x | 0

虽然这取决于它的实现方式,但理论上它应该相对较快(至少与 一样快+x),因为它会首先x转换为数字,然后执行非常有效的 or。

是的,但我相信这种技术会截断大整数,这很糟糕。需要注意的是,我也可以用来代替 Math.floor(),但有同样的问题。
2021-03-31 05:45:24
是各种按位运算符jsperf 以及第一个答案中的方法。我随机排列顺序,因为我发现有些浏览器会根据上一个测试的类似代码优化下一个测试。与顶级回答者不同,我发现隐式是最糟糕的方法。
2021-04-01 05:45:24

这是一个简单的方法: var num = Number(str); 在这个例子中str是包含字符串的变量。您可以测试并查看它是如何工作的打开:Google chrome developer tools,然后转到控制台并粘贴以下代码。阅读评论以更好地了解转换是如何完成的。

// Here Im creating my variable as a string
var str = "258";


// here im printing the string variable: str
console.log ( str );


// here Im using typeof , this tells me that the variable str is the type: string
console.log ("The variable str is type: " + typeof str);


// here is where the conversion happens
// Number will take the string in the parentesis and transform it to a variable num as type: number
var num = Number(str);
console.log ("The variable num is type: " + typeof num);