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

2022-08-30 02:37:23

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


答案 1

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

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

另一方面,如果标识符引用 或 ,则无法使用该方法,它将为您提供 TypeError 异常nullundefinedtoString

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

作为函数调用的构造函数大致等效于:String

value + '';

对象基元的类型转换规则在规范 [[DefaultValue]] 内部操作中进行了详细描述。

简要总结一下,从对象转换为字符串时,将执行以下步骤:

  1. 如果可用,请执行该方法。toString
    • 如果 是基元,则返回 ,否则转到步骤 2。resultresult
  2. 如果可用,请执行该方法。valueOf
    • 如果 是基元,则返回 ,否则转到步骤 3。resultresult
  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
}

如果你想更多地了解这个机制,我建议你看看ToPrimitiveToString的内部操作。

我还建议阅读这篇文章:


答案 2

value.toString()如果 为 null 或未定义,将导致错误。 不应该。valueString(value)

例如:

var value = null;
alert(value.toString());

将失败,因为 .value == null

var value = null;
alert(String(value));

应该显示一条显示“null”(或类似)的消息,但它不会崩溃。