Javascript has lot's of tricks around types and type conversions so I'm wondering if these 2 methods are the same or if there is some corner case that makes them different?
Javascript has lot's of tricks around types and type conversions so I'm wondering if these 2 methods are the same or if there is some corner case that makes them different?
They are not completely the same, and actually, the String constructor called as a function (your first example), will at the end, call the toString
method of the object passed, for example:
var o = { toString: function () { return foo; } };
String(o); // foo
On the other hand, if an identifier refers to null
or undefined
, you can't use the toString
method, it will give you a TypeError
exception:
var value = null;
String(null); // null
value.toString(); // TypeError
The String
constructor called as a function would be roughly equivalent to:
value + '';
The type conversion rules from Object-to-Primitive are detailed described on the specification, the [[DefaultValue]]
internal operation.
Briefly summarized, when converting from Object-to-String, the following steps are taken:
toString
method.result
is a primitive, return result
, else go to Step 2.valueOf
method.result
is a primitive, return result
, else go to Step 3.TypeError
.Given the above rules, we can make an example of the semantics involved:
var o = {
toString: function () { return foo; },
valueOf: function () { return bar; }
};
String(o); // foo
// Make the toString method unavailable:
o.toString = null;
String(o); // bar
// Also make the valueOf method unavailable:
o.valueOf = null;
try {
String(o);
} catch (e) {
alert(e); // TypeError
}
If you want to know more about this mechanism I would recommend looking at the ToPrimitive
and the ToString
internal operations.
I also recommend reading this article: