它们并不完全相同,实际上,作为函数调用的 String 构造函数 http://bclary.com/2004/11/07/#a-15.5.1(你的第一个例子),将在最后调用toString
传递的对象的方法,例如:
var o = { toString: function () { return "foo"; } };
String(o); // "foo"
另一方面,如果标识符指的是null
or undefined
,你不能使用toString
方法,它会给你一个TypeError
例外:
var value = null;
String(null); // "null"
value.toString(); // TypeError
The String
作为函数调用的构造函数大致相当于:
value + '';
类型转换规则来自Object-to-原始详细描述了规范,[[DefaultValue]] http://bclary.com/2004/11/07/#a-8.6.2.6内部操作。
简要总结一下,当从Object-to-String,采取以下步骤:
- If available, execute the
toString
method.
- If the
result
is a 原始, 返回result
,否则转至步骤 2。
- If available, execute the
valueOf
method.
- If the
result
is a 原始, 返回result
,否则转至步骤 3。
- Throw
TypeError
.
考虑到上述规则,我们可以举一个所涉及的语义的例子:
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
}
如果您想了解有关此机制的更多信息,我建议您查看ToPrimitive http://bclary.com/2004/11/07/#a-9.1和ToString http://bclary.com/2004/11/07/#a-9.8内部运作。
我还推荐阅读这篇文章:
- JavaScript 中的对象到基元转换 http://www.adequatelygood.com/2010/3/Object-to-Primitive-Conversions-in-JavaScript