Answers:
像这样:
var foo = 45;
var bar = '' + foo;
实际上,尽管我通常这样做是为了简单方便,但对于原始速度而言,似乎出现了1000多次迭代,但对于.toString()
请参阅此处的性能测试(不是我自己的,而是在我自己编写时发现的):http : //jsben.ch/#/ghQYR
根据上述JSPerf测试最快: str = num.toString();
应该注意的是,当您认为速度差异可以在0.1秒内进行1百万次转换时,速度差异并不是太大。
更新:速度因浏览器而异。在Chrome中num + ''
,根据此测试,看来速度最快http://jsben.ch/#/ghQYR
更新2:再次根据我上面的测试,应该注意到Firefox 20.0.1的执行.toString()
速度比'' + num
示例慢约100倍。
null foo
不会引发错误。
我认为n.toString()
该奖项以其清晰为目的,我认为它不会带来任何额外的开销。
null
,undefined
)没有这个答案几乎工作,使得“不安全”。
null
或者undefined
它是针对特定应用的,尽管我想这(n || defaultNumber).toString()
是大多数人在这种情况下想要的,但我强烈不同意我们应该将其应用于所有问题。这是关于将数字转换为字符串,良好的体系结构以及其他需要进行单独的课程的类型转换。
对于该语言的新手来说,显式转换非常明显。正如其他人所建议的那样,如果开发人员不了解强制规则,则使用类型强制会导致歧义。最终,开发人员的时间要比CPU时间花费更多,因此我会以后者为代价对前者进行优化。话虽这么说,这种情况下的差异可能微不足道,但是如果不是这样的话,我敢肯定有一些不错的JavaScript压缩器可以优化这种情况。
因此,出于上述原因,我建议使用:n.toString()
或String(n)
。 String(n)
可能是一个更好的选择,因为如果n
为null或未定义,它不会失败。
null
或undefined
。如果n
是null
或undefined
由于我的程序中的错误引起的,那么我希望我的程序在这种状态下失败,以便给我一个更好的机会来发现并修复该错误。程序崩溃是给程序员的礼物,可以帮助她发现错误:-)。另一种选择是交付经过精心掩盖的错误后无法正常工作的软件。因此,我不喜欢String(n)
掩盖错误。
String(n)
非常适合用于功能性样式,例如带下划线的Combine _.compose(funcThatNeedsAStringParam, String)
。
... JavaScript的解析器尝试将数字上的点符号解析为浮点文字。
2..toString(); // the second point is correctly recognized
2 .toString(); // note the space left to the dot
(2).toString(); // 2 is evaluated first
舌头很明显:
var harshNum = 108;
"".split.call(harshNum,"").join("");
或者在ES6中,您可以简单地使用 模板字符串:
var harshNum = 108;
`${harshNum}`;
'' + number
方法更快。这就是说,这些基准测试的结果在多次执行时会有很大差异,因此不确定是否应该将它们视为过于严肃的测试。
其他答案已经涵盖了其他选项,但我更喜欢以下选项:
s = `${n}`
简短,简洁,已经在其他许多地方使用(如果您使用的是现代框架/ ES版本),因此可以肯定,任何程序员都可以理解。
n.toString()
,是吗?
n
是undefined
,它将通过使用.toString()
String(n)
在所有情况下都能得到相同的结果吗?唯一的区别是不清楚。
我使用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)
处理null,未定义,符号,[任何内容]并调用.toString()
对象。
'' + x
来电 .valueOf()
x(广播到数字), Symbols可以提供与实现相关的结果。
x.toString()
引发null和未定义。
注意:String(x)
在没有原型的对象上仍然会失败Object.create(null)
。
如果您不喜欢“ Hello,undefined”之类的字符串,或者不希望支持缺少原型的对象,请使用以下类型转换函数:
/**
* 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));
}
对于数字文字,用于访问属性的点必须与小数点区分开。如果要在数字文字123上调用String(),则可以使用以下选项:
123..toString()
123 .toString() // space before the dot 123.0.toString()
(123).toString()
如果有时间,我将使用更多数据重新编辑此文件,因为现在很好...
在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
使用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
每次我运行类似的时间。
'' + 123e-50
回报"1.23e-48"
。