Javascript 在类型和类型转换方面有很多“技巧”,所以我想知道这两个方法是否相同,或者是否有一些边缘情况使它们不同?
如果 value为 null 或未定义,则 value.toString()将导致错误。
value
value.toString()
例如:
var value = null; alert(value.toString());
会失败,因为 value == null。
value == null
var value = null; alert(String(value));
应该显示一条消息,读取“空”(或类似) ,但它不会崩溃。
在每种情况下,除了没有 null或 undefined属性的值之外,String(value)应该具有与 value.toString()相同的结果。''+value也会产生同样的结果。
null
undefined
String(value)
''+value
它们并不完全相同,实际上,作为函数调用的 String 构造函数(您的第一个示例)将在最后调用传递的对象的 toString方法,例如:
toString
var o = { toString: function () { return "foo"; } }; String(o); // "foo"
另一方面,如果一个标识符指向 null或者 undefined,你不能使用 toString方法,它会给你一个 TypeError异常:
TypeError
var value = null; String(null); // "null" value.toString(); // TypeError
作为函数调用的 String构造函数大致相当于:
String
value + '';
从 反对到 原始的类型转换规则详细描述了 [[DefaultValue]]的规范、内部操作。
[[DefaultValue]]
简要总结,当从 反对转换到 绳子时,需要采取以下步骤:
result
valueOf
根据上面的规则,我们可以举一个涉及到的语义的例子:
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 }
如果您想更多地了解这种机制,我建议您查看 ToPrimitive和 ToString内部操作。
ToPrimitive
ToString
我也建议读读这篇文章:
String () [ 构造函数调用]基本上是在调用 < strong > . toString ()
. toString () 和 String ()可以在基本值(number、 boolean、 string)上调用,基本上不做任何特殊的事情:
True = > ‘ true’ False = > ‘ false’ 17 = >’17’ “你好”= > “你好”
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 ()
如果两者都在一个物体里呢?
如果我们想把这个对象当作 string = > 使用 . toString ()
如果我们想把这个对象当作数字 = > 使用 . valueOf ()
如果我们只定义了 . valueOf ()呢?
.将调用对象内部定义的 valueOf () ,无论我们希望将对象作为字符串还是作为数字处理
我刚刚在 ES6中尝试了这个方法,发现为了让 String()查看对象内部的 valueOf(),对象必须具有 toString()方法。如果对象没有 toString(),则控制台返回 '[object Object]',而不管是否有 valueOf()。所以在第一个“步骤”中,我们总是必须使用 toString(),否则 String()方法不会查看 valueOf。
String()
valueOf()
toString()
'[object Object]'
请检查这个:
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));