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

什么';在JavaScript中,将数字转换为字符串的最佳方法是什么?,javascript,string,performance,coding-style,numbers,Javascript,String,Performance,Coding Style,Numbers,将数字转换为字符串的“最佳”方式是什么(在速度优势、清晰度优势、内存优势等方面) 一些例子: String(n) n.toString() ”+n n+” 像这样: var foo = 45; var bar = '' + foo; 实际上,尽管我通常这样做是为了简单方便,但在1000多次迭代中,对于原始速度,.toString() 请参阅此处的性能测试(不是我自己做的,而是在编写自己的测试时发现的): 基于上述JSPerf测试的最快速度:str=num.toString() 应该注意的是,

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

一些例子:

  • String(n)

  • n.toString()

  • ”+n

  • n+”

  • 像这样:

    var foo = 45;
    var bar = '' + foo;
    
    实际上,尽管我通常这样做是为了简单方便,但在1000多次迭代中,对于原始速度,
    .toString()

    请参阅此处的性能测试(不是我自己做的,而是在编写自己的测试时发现的):

    基于上述JSPerf测试的最快速度:
    str=num.toString()

    应该注意的是,当考虑到在0.1秒内< 100万>强> >强> < /P>时,速度的差别并不是非常显著。 更新:速度似乎因浏览器而异。基于此测试,Chrome中的
    num+'
    似乎是最快的


    更新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
    为null或未定义,它不会失败。

    如果我必须考虑所有因素,我建议如下

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

    这是转换成字符串的最快方法。如果我错了,请更正。

    如果需要将结果格式化为特定的小数位数,例如,为了表示货币,需要类似于
    toFixed()
    的方法

    number.toFixed( [digits] )
    
    digits
    是小数点后显示的位数。

    显然是在开玩笑:

    或者在ES6中,您可以简单地使用:

    …JavaScript的解析器尝试解析 作为浮点文字的数字上的点符号


    如果您想知道哪一个是最有效的,请查看我比较所有不同的数字->字符串转换的地方

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

    我们也可以使用构造函数。在Firefox58中,这是将数字转换为字符串的最快方法,尽管它比
    
    “+num
    在流行浏览器Google Chrome中。方法
    toFixed()
    也可以解决这个问题

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

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

    s = `${n}`
    
    简短、简洁,已经在许多其他地方使用过(如果您使用的是现代的framework/ES版本),因此任何程序员都会理解它


    并不是说它(通常)很重要,但它似乎也可以与相比较。

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

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


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

    最近刚遇到此问题,方法3和4不合适,因为字符串是如何复制然后组合在一起的。对于一个小程序,此问题无关紧要,但对于任何真正的web应用程序,此操作都必须处理频繁的字符串操作会影响性能和可读性


    .

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

    节点测试v8.11.2:2018/06/06

    设i=0;
    控制台时间(“test1”)
    
    对于(;i来说,使用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");
    
    每次运行时都有类似的时间。

    我曾经为以下情况创建一个测试用例:

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

    截至2018年7月24日,结果显示,
    number+'
    是Chrome浏览器中速度最快的浏览器,在Firefox中与模板字符串文字相关联

    String(number)
    number.toString()
    都比最快的选项慢大约95%


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

    说明:

    String(x)
    处理空值、未定义、符号、[anything]并调用对象的
    .toString()

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

    x.toString()
    抛出空值和未定义
    s = `${n}`
    
    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
    
    number + ''
    `${number}`
    String(number)
    number.toString()
    
    /**
     * 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..toString()
    123 .toString() // space before the dot 123.0.toString()
    (123).toString()
    
    var num = 1
    
    num = `${num}`
    
    num = num + ''
    
    num = String(num)
    
    num = num.toString()