Javascript在类型和类型转换方面有很多“技巧”,所以我想知道这两种方法是否相同,或者是否存在一些使它们不同的极端情况?
答案 0 :(得分:102)
它们并不完全相同,实际上,the String constructor called as a function(您的第一个示例)最后将调用传递的对象的toString
方法,例如:
var o = { toString: function () { return "foo"; } };
String(o); // "foo"
另一方面,如果标识符引用null
或undefined
,则您无法使用toString
方法,它会为您提供 {{1}例外:
TypeError
作为函数调用的var value = null;
String(null); // "null"
value.toString(); // TypeError
构造函数大致相当于:
String
Object -to- Primitive 中的类型转换规则详细说明了规范[[DefaultValue]]
内部操作。
简要总结,从 Object -to- String 转换时,采取以下步骤:
value + '';
方法。
toString
是原语,请返回result
,否则请转到步骤2. result
方法。
valueOf
是原语,请返回result
,否则请转到第3步。result
。鉴于上述规则,我们可以举例说明所涉及的语义:
TypeError
如果您想了解有关此机制的更多信息,我建议您查看ToPrimitive
和ToString
内部操作。
我还建议阅读这篇文章:
答案 1 :(得分:23)
value.toString()
为空, value
将导致错误。 String(value)
不应该。{/ p>
例如:
var value = null;
alert(value.toString());
将失败,因为value == null
。
var value = null;
alert(String(value));
应显示消息“null”(或类似),但不会崩溃。
答案 2 :(得分:1)
String() [构造函数调用]基本上是调用 .toString()
可以在原始值(数字,布尔值,字符串)上调用.toString()和 String(),基本上不会做任何特别的事情:
true => '真'
false => '假'
17 => ' 17'
'你好' => '你好'
但是在对象上调用这些函数是事情变得有趣的地方:
如果对象具有自己的.toString()函数,则在需要将此对象视为字符串(显式/隐式)时将调用该对象
let obj = {
myName:"some object",
toString:function(){ return this.myName; }
}
//implicitly treating this obj as a string
"hello " + obj; //"hello some object"
//OR (explicitly)
"hello " + String(obj) //calling the existent toString function
//OR
"hello " + obj.toString(); //calling toString directly
顺便说一下,如果您想将此对象视为数字,则应在其中定义 .valueOf()函数。
如果我们同时拥有一个对象怎么办?如果我们想将此对象视为字符串=>使用 .toString()
如果我们想将此对象视为数字=>使用 .valueOf()
如果我们只定义 .valueOf()会怎么样?
无论我们是要将对象作为字符串还是作为数字处理,都会调用对象内部定义的.valueOf()
答案 3 :(得分:0)
String(value)
或value.toString()
等属性的值之外, null
在每种情况下都应与undefined
具有相同的结果。 ''+value
会产生相同的结果。