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

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

53765 次浏览

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

例如:

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

会失败,因为 value == null

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

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

在每种情况下,除了没有 nullundefined属性的值之外,String(value)应该具有与 value.toString()相同的结果。''+value也会产生同样的结果。

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

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

另一方面,如果一个标识符指向 null或者 undefined,你不能使用 toString方法,它会给你一个 TypeError异常:

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

作为函数调用的 String构造函数大致相当于:

value + '';

反对原始的类型转换规则详细描述了 [[DefaultValue]]的规范、内部操作。

简要总结,当从 反对转换到 绳子时,需要采取以下步骤:

  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
}

如果您想更多地了解这种机制,我建议您查看 ToPrimitiveToString内部操作。

我也建议读读这篇文章:

String () [ 构造函数调用]基本上是在调用 < strong > . toString ()

. toString () String ()可以在基本值(number、 boolean、 string)上调用,基本上不做任何特殊的事情:

True = > ‘ true’

False = > ‘ 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 ()函数定义在它。

如果两者都在一个物体里呢?

如果我们想把这个对象当作 string = > 使用 . toString ()

如果我们想把这个对象当作数字 = > 使用 . valueOf ()

如果我们只定义了 . valueOf ()呢?

.将调用对象内部定义的 valueOf () ,无论我们希望将对象作为字符串还是作为数字处理

我刚刚在 ES6中尝试了这个方法,发现为了让 String()查看对象内部的 valueOf(),对象必须具有 toString()方法。如果对象没有 toString(),则控制台返回 '[object Object]',而不管是否有 valueOf()。所以在第一个“步骤”中,我们总是必须使用 toString(),否则 String()方法不会查看 valueOf

请检查这个:

let obj = {
name:'b',
age:22,
valueOf: function(){
return 'heeee';
}
}


String(obj); // prints '[object Object]'

另一方面,

let obj = {
name:'b',
age:22,
toString:null,
valueOf: function(){
return 'heeee';
}
}
String(obj); // prints 'heeee'

let obj = {
name: 'b',
age: 22,
valueOf: function() {
return 'heeee';
}
}


console.log(String(obj));


let obj2 = {
name: 'b',
age: 22,
toString: null,
valueOf: function() {
return 'heeee';
}
}


console.log(String(obj2));