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

时间:2012-10-12 15:43:07

标签: javascript

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

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

9 个答案:

答案 0 :(得分:172)

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

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

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

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

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

答案 1 :(得分:63)

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

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

e.g。

~~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函数实际上是最快的选项,可能是浏览器高度优化的,但这一切都取决于您的要求 all 选项足够快http://jsperf.com/best-of-string-to-number-conversion/37

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

我的理论是:

  • 谎言
  • Darn lines
  • 统计
  • JSPerf结果:)

答案 2 :(得分:7)

将字符串转换为整数的快速方法是使用按位或类似:

x | 0

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

答案 3 :(得分:4)

这是一种简单的方法: var num = Number(str); 在本例中 str 是包含字符串的变量。 您可以测试并查看其工作原理: Google Chrome开发人员工具,然后转到控制台并粘贴以下代码。 阅读评论以更好地了解转换是如何完成的。

// 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);

答案 4 :(得分:4)

使用+运算符前缀字符串。

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

答案 5 :(得分:3)

这可能不是那么快,但还有一个额外的好处,即确保您的号码至少是某个值(例如0),或者至多是某个值:

Math.max(input, 0);

如果您需要确保最低价值,通常是

var number = Number(input);
if (number < 0) number = 0;

Math.max(..., 0)使您免于撰写两个陈述。

答案 6 :(得分:1)

我发现num * 1简单明了,适用于整数和浮点数......

答案 7 :(得分:0)

您可以尝试使用UnitOf,这是我们刚刚正式发布的测量和数据类型转换库! UnitOf超级快,体积小并且可以高效地转换任何数据类型,而不会抛出错误或null / undefined。转换不成功时,将返回您定义的默认值或UnitOf的默认值。

//One liner examples
UnitOf.DataType("12.5").toFloat(); //12.5 of type Float is returned. 0 would be returned if conversion failed.
UnitOf.DataType("Not A Num").toInt(10); //10 of type Int is returned as the conversion failed.

//Or as a variable
var unit = UnitOf.DataType("12.5");
unit.toInt(5); //12.5 of type Float is returned. 5 would be returned if the conversion failed.
unit.toFloat(8); // 12 of type Int is returned. 8 would be returned if the conversion failed.

答案 8 :(得分:0)

最快的方法是使用-0:

const num = "12.34" - 0;