What's the best way to convert a number to a string in JavaScript?
什么是将数字转换为字符串的"最佳"方式(在速度优势,清晰度优势,内存优势等方面)?
一些例子:
像这样:
1 2 | var foo = 45; var bar = '' + foo; |
实际上,即使我通常这样做是为了简单方便,但是对于原始速度来说,超过1,000次的迭代看起来有一个优势
请参阅此处的性能测试(不是我,但在我自己编写时发现):
http://jsben.ch/#/ghQYR
最快的基于上面的JSPerf测试:
应该注意的是,当您考虑到它可以在0.1秒内以任何方式进行1百万次转换时,速度差异并不过分显着。
更新:浏览器的速度似乎有很大差异。在Chrome
更新2:再次基于我上面的测试,应该注意Firefox 20.0.1执行
在我看来,
明确的转换对于该语言的新手非常清楚。正如其他人所建议的那样,如果开发人员不了解强制规则,则使用类型强制会导致歧义。最终开发人员的时间比CPU时间更昂贵,因此我会以后者为代价优化前者。话虽这么说,在这种情况下,差异可能是微不足道的,但如果不是,我敢肯定有一些不错的JavaScript压缩器将优化这种事情。
所以,由于上述原因,我会选择:
...JavaScript's parser tries to parse
the dot notation on a number as a floating point literal.
1 2 3 | 2..toString(); // the second point is correctly recognized 2 .toString(); // note the space left to the dot (2).toString(); // 2 is evaluated first |
资源
舌头明显:
1 2 | var harshNum = 108; "".split.call(harshNum,"").join(""); |
或者在ES6中,您可以简单地使用模板字符串:
1 2 | var harshNum = 108; `${harshNum}`; |
将任何变量转换为字符串的最简单方法是向该变量添加空字符串。
1 2 | 5.41 + '' // Result: the string '5.41' Math.PI + '' // Result: the string '3.141592653589793' |
其他答案已涵盖其他选项,但我更喜欢这个:
1 | s = `${n}` |
简短,简洁,已经在许多其他地方使用过(如果你使用的是现代框架/ ES版本),那么任何程序员都能理解它是安全的。
并不是说它(通常)很重要,但与其他方法相比,它似乎也是最快的。
如果需要将结果格式化为特定的小数位数(例如表示货币),则需要类似
1 | number.toFixed( [digits] ) |
我使用https://jsperf.com为以下情况创建测试用例:
1 2 3 4 | number + '' `${number}` String(number) number.toString() |
https://jsperf.com/number-string-conversion-speed-comparison
截至2018年7月24日,结果表明
我喜欢前两个,因为它们更容易阅读。我倾向于使用
这是除非你有一条线
1 2 | var n = 5; console.log ("the number is:" + n); |
这是非常自我解释的
我认为这取决于具体情况,但无论如何你可以使用
.toString()是内置的类型转换功能,我不是那些细节的专家,但每当我们比较内置类型转换和显式方法时,内置的变通方法总是首选。
几乎所有可能的现有和未来情况(输入是数字,空,未定义,符号,其他任何东西)的唯一有效解决方案是
说明:
注意:
如果您不喜欢'Hello,undefined'之类的字符串或想要支持无原型对象,请使用以下类型转换函数:
1 2 3 4 5 6 7 8 | /** * 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)); } |
如果我不得不考虑所有因素,我会建议你跟进
1 2 3 4 | var myint = 1; var mystring = myint + ''; /*or int to string*/ myint = myint + '' |
恕我直言,它是转换为字符串的最快方式。如果我错了,请纠正我。
我们也可以使用String构造函数。根据这个基准测试,它是在Firefox 58中将Number转换为String的最快方法,即使它在流行的浏览器Google Chrome中比
" + num
方法
1 2 | var n = 8.434332; n.toFixed(2) // 8.43 |
您可以调用
您可以将此技巧用于其他javascript本机对象。
刚刚遇到这个问题,方法3和方法4不合适,因为如何复制字符串然后放在一起。对于一个小程序,这个问题是微不足道的,但是对于任何真正的Web应用程序,我们必须处理频率字符串操作的这个动作会影响性能和可读性。
这是阅读的链接。
当我有时间时,我将用更多数据重新编辑它,因为现在这很好......
在nodejs v8.11.2:2018/06/06中测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 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") |
产量
1 2 3 4 5 6 7 8 9 | 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时似乎有类似的结果。我运行了这个脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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"); |
并得到以下结果:
1 2 3 4 | ? node testing.js string concat testing: 2802.542ms string obj testing: 3374.530ms string both: 2660.023ms |
每次运行时都会出现类似的情况。
如果你很好奇哪个是性能最高的,那就检查一下我在哪里比较所有不同的Number - > String转换。
看起来像
https://jsperf.com/int-2-string