String(value)与value.toString()之间有什么区别
Javascript有很多关于types和types转换的“技巧”,所以我想知道这两种方法是否相同,或者是否有一些特殊情况会使它们不同?
它们并不完全相同,实际上, 作为函数调用的String构造函数 (您的第一个示例)将在最后调用传递的对象的toString方法,例如: 
 var o = { toString: function () { return "foo"; } }; String(o); // "foo" 
 另一方面,如果一个标识符引用null或undefined ,你不能明显地使用toString方法,它会给你一个TypeErrorexception : 
 var value = null; String(null); // "null" value.toString(); // TypeError 
 被称为函数的String构造函数大致等价于: 
 value+''; 
  Object- to- Primitive中的types转换规则在规范中详细描述, [[DefaultValue]]内部操作。 
简而言之,从Object- to- String转换时,采取以下步骤:
-  如果可用,执行toString方法。-  如果result不是原语 ,则转到步骤2,否则返回result
 
-  如果
-  如果可用,请执行valueOf方法。-  如果result是一个原语 ,返回result,否则步骤3。
 
-  如果
-  抛出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" // Now make the valueOf method also unavailable: o.valueOf = null; try { String(o); } catch (e) { alert(e); // TypeError! } 
 如果你想在这个机制中进一步ToPrimitive ,我build议你看一下ToPrimitive和ToString内部操作。 
另外我会build议你这篇文章:
- JavaScript中的对象到原始转换
 如果value为null,则value.toString()将导致错误。  String(value)不应该。 
例如:
 var value = null; alert(value.toString()); 
 将失败,因为value == null 。 
 var value = null; alert(String(value)); 
应该显示一条消息“null”(或类似的),但不会崩溃。
 在所有情况下, String(value)都应该和value.toString()具有相同的结果,除了没有像null或undefined这样的属性的null 。  ''+value会产生相同的结果。 
String() [ 构造函数调用 ]基本上调用.toString()
.toString()和String()可以在原始值(数字,布尔值,string)上调用,基本上什么也不做:
true =>'true'
false =>'false'
17 => '17'
'hello'=>'你好'
但是在对象上调用这些函数就是事情变得有趣的地方:
如果这个对象有自己的.toString()函数,那么当你需要这个对象被当作一个string(显式/隐式地)
 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()函数。
如果我们有一个对象呢?
如果我们想把这个对象当作一个string=>使用.toString()
如果我们想把这个对象当成一个数字=>使用.valueOf()
如果我们只有.valueOf()定义?
在对象内部定义的.valueOf()将被调用,无论我们想要处理的对象作为一个string或数字