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

Alf*_*TeK 90 javascript

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

CMS*_*CMS 112

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

var o = { toString: function () { return "foo"; } };
String(o); // "foo"
Run Code Online (Sandbox Code Playgroud)

另一方面,如果标识符引用nullundefined,您不能使用该toString方法,它将给您一个TypeError例外:

var value = null;
String(null);     // "null"
value.toString(); // TypeError
Run Code Online (Sandbox Code Playgroud)

String被称为函数的构造函数大致相当于:

value + '';
Run Code Online (Sandbox Code Playgroud)

Object- to- Primitive中的类型转换规则详细描述了规范,即[[DefaultValue]]内部操作.

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

  1. 如果可用,请执行该toString方法.
    • 如果result原始的,则返回result,否则转到步骤2.
  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"

// Also make the valueOf method unavailable:
o.valueOf = null;

try { 
  String(o); 
} catch (e) {
  alert(e); // TypeError
}
Run Code Online (Sandbox Code Playgroud)

如果您想了解更多关于这个机制,我会建议看ToPrimitiveToString内部操作.

我还建议你阅读这篇文章:

  • 还有第三种“方式”,如果你在任何值上调用它:`new String(value)`,它将总是返回一个字符串对象。 (2认同)

Jon*_*han 23

value.toString()如果value为null,将导致错误.String(value)不应该.

例如:

var value = null;
alert(value.toString());
Run Code Online (Sandbox Code Playgroud)

会失败的,因为value == null.

var value = null;
alert(String(value));
Run Code Online (Sandbox Code Playgroud)

应该显示一条消息"null"(或类似),但它不会崩溃.

  • 我从来没有在javascript中看到过空指针异常...你在哪里看到的? (3认同)