Reputation: 150253
I found three ways to cast a variable to String
in JavaScript.
I searched for those three options in the jQuery source code, and they are all in use.
I would like to know if there are any differences between them:
value.toString()
String(value)
value + ""
They all produce the same output, but does one of them better than the others?
I would say the + ""
has an advantage that it saves some characters, but that's not that big advantage, anything else?
Upvotes: 242
Views: 467263
Reputation: 191
In addition to all the above, one should note that, for a defined value v
:
String(v)
calls v.toString()
'' + v
calls v.valueOf()
prior to any other type castSo we could do something like:
var mixin = {
valueOf: function () { return false },
toString: function () { return 'true' }
};
mixin === false; // false
mixin == false; // true
'' + mixin; // "false"
String(mixin) // "true"
Tested in FF 34.0 and Node 0.10
Upvotes: 15
Reputation: 99
if you are ok with null, undefined, NaN, 0, and false all casting to '' then (s ? s+'' : '')
is faster.
see http://jsperf.com/cast-to-string/8
note - there are significant differences across browsers at this time.
Upvotes: 9
Reputation: 1911
Real world example: I've got a log function that can be called with an arbitrary number of parameters: log("foo is {} and bar is {}", param1, param2)
. If a DEBUG
flag is set to true
, the brackets get replaced by the given parameters and the string is passed to console.log(msg)
. Parameters can and will be Strings, Numbers and whatever may be returned by JSON / AJAX calls, maybe even null
.
arguments[i].toString()
is not an option, because of possible null
values (see Connell Watkins answer)arguments[i] + ""
. This may or may not influence a decision on what to use. Some folks strictly adhere to JSLint.Upvotes: 6
Reputation: 382696
They behave the same but toString
also provides a way to convert a number binary, octal, or hexadecimal strings:
Example:
var a = (50274).toString(16) // "c462"
var b = (76).toString(8) // "114"
var c = (7623).toString(36) // "5vr"
var d = (100).toString(2) // "1100100"
Upvotes: 21
Reputation: 12388
On this page you can test the performance of each method yourself :)
http://jsperf.com/cast-to-string/2
here, on all machines and browsers, ' "" + str ' is the fastest one, (String)str is the slowest
Upvotes: 0
Reputation: 14411
They do behave differently when the value
is null
.
null.toString()
throws an error - Cannot call method 'toString' of nullString(null)
returns - "null"null + ""
also returns - "null"Very similar behaviour happens if value
is undefined
(see jbabey's answer).
Other than that, there is a negligible performance difference, which, unless you're using them in huge loops, isn't worth worrying about.
Upvotes: 289
Reputation: 46647
There are differences, but they are probably not relevant to your question. For example, the toString prototype does not exist on undefined variables, but you can cast undefined to a string using the other two methods:
var foo;
var myString1 = String(foo); // "undefined" as a string
var myString2 = foo + ''; // "undefined" as a string
var myString3 = foo.toString(); // throws an exception
Upvotes: 38
Reputation: 1290
According to this JSPerf test, they differ in speed. But unless you're going to use them in huge amounts, any of them should perform fine.
For completeness: As asawyer already mentioned, you can also use the .toString()
method.
Upvotes: 10