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

将数字转换为字符串的“最佳”方法是什么(就速度优势,清晰度优势,内存优势等而言)?

一些例子:

  1. String(n)

  2. n.toString()

  3. ""+n

  4. n+""

神乐米亚2020/03/12 17:56:25

对于数字文字,用于访问属性的点必须与小数点区分开。如果要在数字文字1​​23上调用String(),则可以使用以下选项:

123..toString()
123 .toString() // space before the dot 123.0.toString()
(123).toString()
GO番长2020/03/12 17:56:25

以下是在JS中将Integer转换为String的方法

这些方法按性能的降序排列。

(性能测试结果由@DarckBlezzer在他的答案中给出)

var num = 1

方法1:

num =`$ {num}`

方法2:

num = num +''

方法3:

num =字符串(num)

方法4:

num = num.toString()

注意: 您不能直接从数字中调用tostring()

例如: 2.toString()将抛出未捕获的SyntaxError:无效或意外的令牌

逆天卡卡西2020/03/12 17:56:25

如果有时间,我将使用更多数据重新编辑此文件,因为现在很好...

在Node.js v8.11.2中进行测试:2018/06/06

let i=0;
    console.time("test1")
    for(;i<10000000;i=i+1){
    	const string = "" + 1234;
    }
    console.timeEnd("test1")
    
    i=0;
    console.time("test1.1")
    for(;i<10000000;i=i+1){
    	const string = '' + 1234;
    }
    console.timeEnd("test1.1")
    
    i=0;
    console.time("test1.2")
    for(;i<10000000;i=i+1){
    	const string = `` + 1234;
    }
    console.timeEnd("test1.2")
    
    i=0;
    console.time("test1.3")
    for(;i<10000000;i=i+1){
    	const string = 1234 +  '';
    }
    console.timeEnd("test1.3")
    
    
    i=0;
    console.time("test2")
    for(;i<10000000;i=i+1){
    	const string = (1234).toString();
    }
    console.timeEnd("test2")
    
    
    i=0;
    console.time("test3")
    for(;i<10000000;i=i+1){
    	const string = String(1234);
    }
    console.timeEnd("test3")
    
    
    i=0;
    console.time("test4")
    for(;i<10000000;i=i+1){
    	const string = `${1234}`;
    }
    console.timeEnd("test4")
    
    i=0;
    console.time("test5")
    for(;i<10000000;i=i+1){
    	const string = 1234..toString();
    }
    console.timeEnd("test5")
    
    i=0;
    console.time("test6")
    for(;i<10000000;i=i+1){
    	const string = 1234 .toString();
    }
    console.timeEnd("test6")

输出

test1: 72.268ms
test1.1: 61.086ms
test1.2: 66.854ms
test1.3: 63.698ms
test2: 207.912ms
test3: 81.987ms
test4: 59.752ms
test5: 213.136ms
test6: 204.869ms
十三泡芙2020/03/12 17:56:25

方法toFixed()也会解决目的。

var n = 8.434332;
n.toFixed(2)  // 8.43
JinJin乐2020/03/12 17:56:25

我们还可以使用String构造函数。根据此基准,即使比 " + num流行的浏览器Google Chrome 它也是在Firefox 58中将数字转换为字符串的最快方法

做个有心人2020/03/12 17:56:25

刚刚遇到这个问题,方法3和4不适合,因为如何复制字符串然后将它们放在一起。对于小型程序而言,此问题无关紧要,但是对于任何实际的Web应用程序,我们必须处理频率字符串操作的此操作可能会影响性能和可读性。

这是读取的链接

猴子神无2020/03/12 17:56:25

您可以先调用Numberobject,然后调用toString()

Number.call(null, n).toString()

您可以将此技巧用于其他javascript本机对象。

Sam蛋蛋Itachi2020/03/12 17:56:25

如果您好奇哪个是性能最高的,请查看此处比较所有不同的Number-> String转换。

看起来2+''还是2+""最快的。

https://jsperf.com/int-2-string

十三小哥2020/03/12 17:56:25

如果我不得不考虑所有因素,我建议

var myint = 1;
var mystring = myint + '';
/*or int to string*/
myint = myint + ''

恕我直言,它是最快的方式转换为字符串。如果我错了,请纠正我。

梅Near米亚2020/03/12 17:56:25

.toString()是内置的类型转换函数,我对此并不熟练,但是每当我们比较内置类型转换和显式方法时,总是首选内置解决方法。

小哥猴子2020/03/12 17:56:25

我使用https://jsperf.com为以下情况创建了一个测试用例:

number + ''
`${number}`
String(number)
number.toString()

https://jsperf.com/number-string-conversion-speed-comparison

截至2018年7月24日,结果表明这number + ''是Chrome中最快的,与模板字符串文字相关联的Firefox。

两者String(number),并且number.toString()比最快的选项慢95%左右。

性能测试,如上所述

西门神奇2020/03/12 17:56:25

我认为这取决于情况,但是无论如何您都可以使用该.toString()方法,因为它很容易理解。

SamStafan2020/03/12 17:56:25

我喜欢前两个,因为它们更易于阅读。我倾向于使用,String(n)但这仅是样式问题。

那就是除非你有一行

var n = 5;
console.log ("the number is: " + n);

这是很自我解释的

路易卡卡西2020/03/12 17:56:25

像这样:

var foo = 45;
var bar = '' + foo;

Actually, even though I typically do it like this for simple convenience, over 1,000s of iterations it appears for raw speed there is an advantage for .toString()

See Performance tests here (not by me, but found when I went to write my own): http://jsben.ch/#/ghQYR

Fastest based on the JSPerf test above: str = num.toString();

It should be noted that the difference in speed is not overly significant when you consider that it can do the conversion any way 1 Million times in 0.1 seconds.

Update: The speed seems to differ greatly by browser. In Chrome num + '' seems to be fastest based on this test http://jsben.ch/#/ghQYR

更新2:再次根据我上面的测试,应该注意到Firefox 20.0.1的执行.toString()速度比'' + num示例慢约100倍

神无LEY2020/03/12 17:56:25

如果需要将结果格式设置为特定的小数位数(例如代表货币),则需要类似toFixed()方法的方法。

number.toFixed( [digits] )

digits 是小数点后显示的位数。

Mandy小卤蛋凯2020/03/12 17:56:25

我认为n.toString()该奖项以其清晰为目的,我认为它没有任何额外的开销。

阳光Itachi2020/03/12 17:56:25

... JavaScript的解析器尝试将数字上的点符号解析为浮点文字。

2..toString(); // the second point is correctly recognized
2 .toString(); // note the space left to the dot
(2).toString(); // 2 is evaluated first

资源

Tom阿飞2020/03/12 17:56:25

舌头很明显:

var harshNum = 108;
"".split.call(harshNum,"").join("");

或者在ES6中,您可以简单地使用模板字符串

var harshNum = 108;
`${harshNum}`;
Jim老丝梅2020/03/12 17:56:25

对于该语言的新手来说,显式转换非常明显。正如其他人所建议的那样,如果开发人员不了解强制规则,则使用类型强制会导致歧义。最终,开发人员的时间要比CPU时间花费更多,因此我会以后者为代价对前者进行优化。话虽这么说,这种情况下的差异可能微不足道,但是如果不是这样的话,我敢肯定,有一些不错的JavaScript压缩器可以优化这种情况。

因此,出于上述原因,我建议使用:n.toString()String(n)String(n)可能是一个更好的选择,因为如果n为null或未定义,它不会失败

Pro西门2020/03/12 17:56:25

其他答案已经涵盖了其他选项,但我更喜欢以下选项:

s = `${n}`

简短,简洁,已经在其他许多地方使用(如果您使用的是现代框架/ ES版本),因此可以肯定,任何程序员都可以理解。

并不是(通常)有多大关系,但其他方法相比,它似乎是最快的方法