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

What's the best way to convert a number to a string in JavaScript?

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

一些例子:

  • String(n)

  • n.toString()

  • ""+n

  • n+""


  • 像这样:

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

    实际上,即使我通常这样做是为了简单方便,但是对于原始速度来说,超过1,000次的迭代看起来有一个优势.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倍。


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


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

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


    ...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版本),那么任何程序员都能理解它是安全的。

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


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

    1
    number.toFixed( [digits] )

    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日,结果表明number + ''是Chrome中最快的,在Firefox中与模板字符串文字相关联。

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

    performance tests, description above


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

    这是除非你有一条线

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

    这是非常自我解释的


    我认为这取决于具体情况,但无论如何你可以使用.toString()方法,因为它很清楚。


    .toString()是内置的类型转换功能,我不是那些细节的专家,但每当我们比较内置类型转换和显式方法时,内置的变通方法总是首选。


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

    说明:

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

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

    x.toString()抛出null并且未定义。

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

    如果您不喜欢'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
    慢。


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

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

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

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

    您可以将此技巧用于其他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转换。

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

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