String(value)与value.toString()之间有什么区别

Javascript有很多关于types和types转换的“技巧”,所以我想知道这两种方法是否相同,或者是否有一些特殊情况会使它们不同?

它们并不完全相同,实际上, 作为函数调用的String构造函数 (您的第一个示例)将在最后调用传递的对象的toString方法,例如:

 var o = { toString: function () { return "foo"; } }; String(o); // "foo" 

另一方面,如果一个标识符引用nullundefined ,你不能明显地使用toString方法,它会给你一个TypeErrorexception

 var value = null; String(null); // "null" value.toString(); // TypeError 

被称为函数的String构造函数大致等价于:

 value+''; 

Object- to- Primitive中的types转换规则在规范中详细描述, [[DefaultValue]]内部操作。

简而言之,从Object- to- String转换时,采取以下步骤:

  1. 如果可用,执行toString方法。
    • 如果result 不是原语 ,则转到步骤2,否则返回result
  2. 如果可用,请执行valueOf方法。
    • 如果result 是一个原语 ,返回result ,否则步骤3。
  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议你看一下ToPrimitiveToString内部操作。

另外我会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()具有相同的结果,除了没有像nullundefined这样的属性的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或数字