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

时间:2010-10-15 18:55:11

标签: javascript

Javascript在类型和类型转换方面有很多“技巧”,所以我想知道这两种方法是否相同,或者是否存在一些使它们不同的极端情况?

4 个答案:

答案 0 :(得分:102)

它们并不完全相同,实际上,the String constructor called as a function(您的第一个示例)最后将调用传递的对象的toString方法,例如:

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

另一方面,如果标识符引用nullundefined,则您无法使用toString方法,它会为您提供 {{1}例外

TypeError

作为函数调用的var value = null; String(null); // "null" value.toString(); // TypeError 构造函数大致相当于:

String

Object -to- Primitive 中的类型转换规则详细说明了规范[[DefaultValue]]内部操作。

简要总结,从 Object -to- String 转换时,采取以下步骤:

  1. 如果可用,请执行value + ''; 方法。
    • 如果toString原语,请返回result,否则请转到步骤2.
  2. 如果可用,请执行result方法。
    • 如果valueOf原语,请返回result,否则请转到第3步。
  3. 抛出result
  4. 鉴于上述规则,我们可以举例说明所涉及的语义:

    TypeError

    如果您想了解有关此机制的更多信息,我建议您查看ToPrimitiveToString内部操作。

    我还建议阅读这篇文章:

答案 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会产生相同的结果。