What's the best way to convert a number to a s

2019-01-01 12:37发布

问题:

What\'s the \"best\" way to convert a number to a string (in terms of speed advantage, clarity advantage, memory advantage, etc) ?

Some examples:

  1. String(n)

  2. n.toString()

  3. \"\"+n

  4. n+\"\"

回答1:

like this:

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

Actually, even though I typically do it like this for simple convenience, over 1,000s of iterations it appears for raw speed there is an advantage for .toString()

See Performance tests here (not by me, but found when I went to write my own): http://jsben.ch/#/ghQYR

Fastest based on the JSPerf test above: str = num.toString();

It should be noted that the difference in speed is not overly significant when you consider that it can do the conversion any way 1 Million times in 0.1 seconds.

Update: The speed seems to differ greatly by browser. In Chrome num + \'\' seems to be fastest based on this test http://jsben.ch/#/ghQYR

Update 2: Again based on my test above it should be noted that Firefox 20.0.1 executes the .toString() about 100 times slower than the \'\' + num sample.



回答2:

In my opinion n.toString() takes the prize for its clarity, and I don\'t think it carries any extra overhead.



回答3:

Explicit conversions are very clear to someone that\'s new to the language. Using type coercion, as others have suggested, leads to ambiguity if a developer is not aware of the coercion rules. Ultimately developer time is more costly than CPU time, so I\'d optimize for the former at the cost of the latter. That being said, in this case the difference is likely negligible, but if not I\'m sure there are some decent JavaScript compressors that will optimize this sort of thing.

So, for the above reasons I\'d go with: n.toString() or String(n). String(n) is probably a better choice because it won\'t fail if n is null or undefined.



回答4:

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

Source



回答5:

Tongue-in-cheek obviously:

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

Or in ES6 you could simply use template strings:

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


回答6:

The simplest way to convert any variable to a string is to add an empty string to that variable.

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


回答7:

Other answers already covered other options, but I prefer this one:

s = `${n}`

Short, succinct, already used in many other places (if you\'re using a modern framework / ES version) so it\'s a safe bet any programmer will understand it.

Not that it (usually) matters much, but it also seems to be among the fastest compared to other methods.



回答8:

If you need to to format the result to a specific number of decimal places, for example to represent currency, you need something like the toFixed() method.

number.toFixed( [digits] )

digits is the number of digits to display after the decimal place.



回答9:

I like the first two since they\'re easier to read. I tend to use String(n) but it is just a matter of style than anything else.

That is unless you have a line as

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

which is very self explanatory



回答10:

I think it depends on the situation but anyway you can use the .toString() method as it is very clear to understand.



回答11:

If I had to take everything into consideration, I will suggest following

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

IMHO, its the fastest way to convert to string. Correct me if I am wrong.



回答12:

I used https://jsperf.com to create a test case for the following cases:

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

https://jsperf.com/number-string-conversion-speed-comparison

As of 24th of July, 2018 the results say that number + \'\' is the fastest in Chrome, in Firefox that ties with template string literals.

Both String(number), and number.toString() are around 95% slower than the fastest option.

\"performance



回答13:

If you are curious as to which is the most performant check this out where I compare all the different Number -> String conversions.

Looks like 2+\'\' or 2+\"\" are the fastest.

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



回答14:

We can also use the String constructor. According to this benchmark it\'s the fastest way to convert a Number to String in Firefox 58 even though it\'s slower than \" + num in the popular browser Google Chrome.



回答15:

Method toFixed() will also solves the purpose.

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


回答16:

You can call Number object and then call toString().

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

You may use this trick for another javascript native objects.



回答17:

Just come across this recently, method 3 and 4 are not appropriate because how the strings are copied and then put together. For a small program this problem is insignificant, but for any real web application this action where we have to deal with frequency string manipulations can affects the performance and readability.

Here is the link the read.



回答18:

I\'m going to re-edit this with more data when I have time to, for right now this is fine...

Test in 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\")

output

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


回答19:

It seems similar results when using node.js. I ran this script:

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\");

and got the following results:

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

Similar times each time I ran it.



回答20:

The only valid solution for almost all possible existing and future cases (input is number, null, undefined, Symbol, anything else) is String(x). Do not use 3 ways for simple operation, basing on value type assumptions, like \"here I convert definitely number to string and here definitely boolean to string\".

Explanation:

String(x) handles nulls, undefined, Symbols, [anything] and calls .toString() for objects.

\'\' + x calls .valueOf() on x (casting to number), throws on Symbols, can provide implementation dependent results.

x.toString() throws on nulls and undefined.

Note: String(x) will still fail on prototype-less objects like Object.create(null).

If you don\'t like strings like \'Hello, undefined\' or want to support prototype-less objects, use the following type conversion function:

/**
 * 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));
}