String(value)与value.toString()之间有什么区别
Javascript有很多关于types和types转换的“技巧”,所以我想知道这两种方法是否相同,或者是否有一些特殊情况会使它们不同?
它们并不完全相同,实际上, 作为函数调用的String构造函数 (您的第一个示例)将在最后调用传递的对象的toString
方法,例如:
var o = { toString: function () { return "foo"; } }; String(o); // "foo"
另一方面,如果一个标识符引用null
或undefined
,你不能明显地使用toString
方法,它会给你一个TypeError
exception :
var value = null; String(null); // "null" value.toString(); // TypeError
被称为函数的String
构造函数大致等价于:
value+'';
Object- to- Primitive中的types转换规则在规范中详细描述, [[DefaultValue]]
内部操作。
简而言之,从Object- to- String转换时,采取以下步骤:
- 如果可用,执行
toString
方法。- 如果
result
不是原语 ,则转到步骤2,否则返回result
- 如果
- 如果可用,请执行
valueOf
方法。- 如果
result
是一个原语 ,返回result
,否则步骤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" // Now make the valueOf method also unavailable: o.valueOf = null; try { String(o); } catch (e) { alert(e); // TypeError! }
如果你想在这个机制中进一步ToPrimitive
,我build议你看一下ToPrimitive
和ToString
内部操作。
另外我会build议你这篇文章:
- JavaScript中的对象到原始转换
如果value
为null,则value.toString()
将导致错误。 String(value)
不应该。
例如:
var value = null; alert(value.toString());
将失败,因为value == null
。
var value = null; alert(String(value));
应该显示一条消息“null”(或类似的),但不会崩溃。
在所有情况下, String(value)
都应该和value.toString()
具有相同的结果,除了没有像null
或undefined
这样的属性的null
。 ''+value
会产生相同的结果。
String() [ 构造函数调用 ]基本上调用.toString()
.toString()和String()可以在原始值(数字,布尔值,string)上调用,基本上什么也不做:
true =>'true'
false =>'false'
17 => '17'
'hello'=>'你好'
但是在对象上调用这些函数就是事情变得有趣的地方:
如果这个对象有自己的.toString()函数,那么当你需要这个对象被当作一个string(显式/隐式地)
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()将被调用,无论我们想要处理的对象作为一个string或数字