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

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

一些例子:

  1. String(n)

  2. n.toString()

  3. ""+n

  4. n+""

731498 次浏览

像这样:

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

实际上,尽管我通常这样做是为了简单方便,但经过1000多次迭代,它看起来对于原始速度,.toString()有一个优势

在此处查看性能测试(不是我的,而是我自己编写时发现的): http://jsben.ch/#/ghQYR

基于上面的JSPerf测试最快:str = num.toString();

应该注意的是,速度上的差异并不是太显著,当你考虑到它可以做任何方式的转换100万次0.1秒

更新时间:速度似乎因浏览器而异。Chromenum + ''似乎是基于此测试最快的http://jsben.ch/#/ghQYR

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

在我看来,n.toString()因其清晰性而获奖,我认为它不会带来任何额外的开销。

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

除非你有一句台词是

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

这是不言自明的

将任何变量转换为字符串的最简单方法是向该变量添加一个空字符串。

5.41 + ''    // Result: the string '5.41'
Math.PI + '' // Result: the string '3.141592653589793'

我认为这取决于具体情况,但无论如何你可以使用.toString()方法,因为它非常容易理解。

对于不熟悉该语言的人来说,显式转换非常清楚。正如其他人所建议的那样,如果开发人员不知道强制转换规则,使用类型强制转换会导致歧义。最终,开发人员的时间比CPU时间更昂贵,所以我会以牺牲后者为代价来优化前者。话虽如此,在这种情况下,差异可能可以忽略不计,但如果不是,我相信有一些不错的JavaScript压缩器可以优化这种事情。

因此,由于上述原因,我选择:n.toString()String(n)String(n)可能是更好的选择,因为如果n为空或未定义,它不会失败。

如果我必须考虑到一切,我会建议如下

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

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

如果您需要将结果格式到特定的小数位数,来表示货币,则需要类似于toFixed()方法的东西。

number.toFixed( [digits] )

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

很明显的是:

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

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

var harshNum = 108;
`${harshNum}`;

… JavaScript的解析器尝试解析 作为浮点文字的数字上的点表示法。

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

来源

如果您想知道哪个是最高性能的,请查看我比较所有不同的Number->String转换的地方。

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

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

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

方法toFixed()也将解决这个问题。

var n = 8.434332;
n.toFixed(2)  // 8.43

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

s = `${n}`

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

并不是说它(通常)很重要,但与其他方法相比,它似乎也是最快的

您可以调用Number对象,然后调用toString()

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

您可以将此技巧用于另一个javascript本机对象。

最近遇到这个,方法3和4是不合适的,因为字符串是如何复制然后放在一起的。对于一个小程序来说,这个问题是微不足道的,但对于任何真正的Web应用程序来说,我们必须处理频率字符串操作的这个动作会影响性能和易读性。

这里是阅读的链接

当我有时间的时候,我会用更多的数据重新编辑这个,因为现在这很好…

nodejs 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

使用node.js.运行此脚本时似乎会出现类似的结果:

let bar;
let foo = ["45","foo"];


console.time('string concat testing');
for (let i = 0; i < 10000000; i++) {
bar = "" + foo;
}
console.timeEnd('string concat testing');




console.time("string obj testing");
for (let i = 0; i < 10000000; i++) {
bar = String(foo);
}
console.timeEnd("string obj testing");


console.time("string both");
for (let i = 0; i < 10000000; i++) {
bar = "" + foo + "";
}
console.timeEnd("string both");

并得到了以下结果:

❯ node testing.js
string concat testing: 2802.542ms
string obj testing: 3374.530ms
string both: 2660.023ms

类似的时间,每次我跑。

我使用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%左右。

性能测试,如上所述

唯一对于几乎所有可能存在和未来的情况(输入是数字、空值、未定义、符号、其他任何东西)的有效解决方案是String(x)。基于值类型假设,不要使用3种简单操作方法,比如“这里我肯定将数字转换为字符串,这里肯定将布尔值转换为字符串”。

说明:

String(x)处理空值、未定义、符号、[任何东西]并为对象调用.toString()

'' + x调用x上的.valueOf()(转换为数字),抛出符号,可以提供依赖于实现的结果。

x.toString()抛出空值和未定义。

注意:String(x)在像Object.create(null)这样的无原型对象上仍然会失败。

如果你不喜欢像“Hello, unset”这样的字符串,或者想要支持无原型的对象,请使用以下类型转换函数:

/**
* Safely casts any value to string. Null and undefined are converted to ''.
* @param  {*} value
* @return {string}
*/
function string (str) {
return value == null ? '' : (typeof value === 'object' && !value.toString ? '[object]' : String(value));
}

. toString()是内置的类型转换函数,我不是这个细节的专家,但是每当我们比较内置类型转换与显式方法时,内置的解决方法总是首选。

对于数字文字,访问属性的点必须与十进制点区分开来。如果您想在数字文字123上调用String(),您可以使用以下选项:

123..toString()
123 .toString() // space before the dot 123.0.toString()
(123).toString()

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

这些方法按性能递减的顺序排列。

var num = 1

方法一:

num = `${num}`

方法二:

num = num + ''

方法三:

num = String(num)

方法4:

num = num.toString()

备注:你不能直接调用toString()2.toString()会抛出Uncaught SyntaxError: Invalid or unexpected token

(性能测试结果由@陈志立在他的回答中给出)

我推荐`${expression}`,因为你不需要担心错误。

[undefined,null,NaN,true,false,"2","",3].forEach(elem=>{
console.log(`${elem}`, typeof(`${elem}`))
})


/* output
undefined string
null      string
NaN       string
true      string
false     string
2         string
string
3         string
*/


您可以在下面测试速度。但顺序会影响结果。(在StackOverflow中)您可以在您的平台上测试它。

const testCases = [
["${n}", (n) => `${n}`], // 👈
['----', undefined],


[`"" + n`, (n) => "" + n],
[`'' + n`, (n) => '' + n],
[`\`\` + n`, (n) => `` + n],
[`n + ''`, (n) => n + ''],
['----', undefined],


[`String(n)`, (n) =>  String(n)],
["${n}", (n) => `${n}`], // 👈


['----', undefined],
[`(n).toString()`, (n) => (n).toString()],
[`n.toString()`, (n) => n.toString()],


]


for (const [name, testFunc] of testCases) {
if (testFunc === undefined) {
console.log(name)
continue
}
console.time(name)
for (const n of [...Array(1000000).keys()]) {
testFunc(n)
}
console.timeEnd(name)
}