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

什么';在JavaScript中,将字符串转换为数字的最快方法是什么?,javascript,Javascript,任何数字,都是数字。字符串看起来像一个数字,它是数字。其他一切,都是南极洲 'a' => NaN '1' => 1 1 => 1 据我所知,有4种方法 Number(x); parseInt(x, 10); parseFloat(x); +x; 通过我做的这个快速测试,它实际上取决于浏览器 Implicit在3种浏览器上都是最快的,但这会使代码很难阅读…所以选择你喜欢的任何东西 将字符串转换为整数的快速方法是使用按位or,如下所示: x | 0 虽然这取决于它的实现方式

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

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

据我所知,有4种方法

Number(x);
parseInt(x, 10);
parseFloat(x);
+x;
通过我做的这个快速测试,它实际上取决于浏览器


Implicit
在3种浏览器上都是最快的,但这会使代码很难阅读…所以选择你喜欢的任何东西

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

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

至少有5种方法可以做到这一点: 如果只想转换为整数,另一种快速(短)方法是双位not(即使用两个波浪号字符):

e、 g

~~x
参考:

到目前为止,我知道的5种将字符串转换为数字的常用方法都有其不同之处(有更多的按位运算符可以工作,但它们都给出与
~
相同的结果)。此JSFIDLE显示了在调试控制台中可以预期的不同结果:

~~x
版本在“更多”情况下会产生一个数字,而其他版本通常会导致
未定义
,但由于输入无效而失败(例如,如果字符串在有效数字之后包含非数字字符,则返回
0

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

一些性能测试表明,标准的
parseInt
parseFloat
函数实际上是最快的选项,可能是由浏览器高度优化的,但这一切都取决于您的要求,因为所有选项都足够快:

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

我的理论是:
  • 谎言
  • 该死的线
  • 统计数字
  • JSPerf结果:)

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

Math.max(input, 0);
如果您需要确保最小值,通常您会这样做

var number = Number(input);
if (number < 0) number = 0;
var编号=编号(输入);
如果(数量<0)数量=0;

Math.max(…,0)
省去了编写两条语句的麻烦。

这里有一个简单的方法:var num=Number(str)在本例中,str是包含字符串的变量。 您可以测试并查看它是如何打开的:谷歌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);

在字符串前面加上
+
运算符

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

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

您可以尝试使用我们刚刚正式发布的度量和数据类型转换库!UnitOf速度极快,体积小,在转换任何数据类型时都非常高效,而不会抛出错误或null/未定义。转换失败时,将返回您定义的默认值或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.

最快的方法是使用-0:

const num = "12.34" - 0;

什么是最快的取决于在给定时间给定实现中的优化。客观上没有“最快”的方法。使用
'1a'
字符串应该做什么?用
'1'
一个?换句话说,为什么最常用的方法(
Number(x)
parseInt(x,10)
)对您来说还不够?之前的jsperf测试:这里有一个不同方法的良好性能比较:有趣的是,Google Analytics(您粘贴到网站中的部分)使用
1*
进行日期到数字的转换,这与上面的
+
类似。i、 e.
1*新日期()
而不是
+新日期()
。可能它更可读?我认为
1*
是首选,因为它不太容易出错。
+1
之前不需要的悬挂变量不是解析错误。这是一个类似于在
C
@beatak中使用
if(MYCONSTANT==myvar)
的技巧-当前的优化似乎更倾向于本机方法,而不是隐式转换。Windows Server 2008 R2/7上Chrome 37.0.2062.124中的Number()和Firefox 30.0中的ParseInt()速度最快,隐式是这两个版本中速度最慢的。此外,您可以考虑在测试中包含字符串文本浮点进行一般比较。我的猜测是,在某些情况下,它可能会改变顺序,因为字符串到浮点的转换通常比字符串到int的转换慢。按照现在的测试方式,当使用Number()时,它可以进行字符串到int的转换。Chrome 61.0.3163。Number()是最快的。我刚刚将
Number()
~
(只运行了几次)进行了比较,
Number()
赢了,虽然有时几乎是偶数。是的,但我相信这种技术会截断大整数,这很糟糕。需要注意的是,我也可以用来代替Math.floor(),但有相同的问题。我随机化了顺序,因为我发现一些浏览器会基于上一个测试中的类似代码优化下一个测试。与顶级回答者不同,我发现隐式是最糟糕的方法。为什么不使用
Math.abs(input)
?它还将字符串转换为正数,并保存一些额外字符。@AaronGillion:Math.max(-5,0)将返回0;abs(-5)将返回5。这取决于更合理的用例。哦,哎呀,是的,我的用例在我写评论的任何深夜都是不同的。
//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.
const num = "12.34" - 0;