![](/img/trans.png)
[英]Difference between “value.toString” and “value.toString()”
[英]What's the difference between String(value) vs value.toString()
Javascript 在類型和類型轉換方面有很多“技巧”,所以我想知道這兩種方法是否相同,或者是否有一些極端情況使它們不同?
它們並不完全相同,實際上,作為函數調用的 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 + '';
從Object到Primitive的類型轉換規則在規范中詳細描述, [[DefaultValue]]
內部操作。
簡單總結一下,從Object到String 的轉換時,采取了以下步驟:
toString
方法。
result
是一個原語,則返回result
,否則轉到第 2 步。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"
// Also make the valueOf method unavailable:
o.valueOf = null;
try {
String(o);
} catch (e) {
alert(e); // TypeError
}
如果您想了解有關此機制的更多信息,我建議您查看ToPrimitive
和ToString
內部操作。
我還推薦閱讀這篇文章:
如果value
為 null 或 undefined, 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()可以在原始值(數字,布爾值,字符串)上調用,基本上不會做任何特別的事情:
真 => '真'
假 => '假'
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()函數定義在它里面。
如果我們在一個對象中同時擁有兩者呢?
如果我們想將此對象視為字符串 => 使用.toString()
如果我們想將此對象視為數字 => 使用.valueOf()
如果我們只定義了.valueOf()呢?
無論我們想將對象作為字符串還是數字處理,都將調用對象內部定義的.valueOf()
我剛剛用 ES6 嘗試了這個,發現要讓String()
查看對象內部的valueOf()
,對象必須有toString()
方法。 如果對象沒有toString()
那么無論是否有valueOf()
控制台都會返回'[object Object]'
。 因此,在第一個“步驟”中,無論如何我們總是必須使用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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.