tostring 和 valueOf 函數(shù)是解決值的顯示和運算的問題。所有的 Object 類型的數(shù)據(jù)都自帶 toString 和 valueOf 函數(shù)。
比如我們定一個 Object 類型數(shù)據(jù):
const obj = {
name: "duxin"
}
console.log(obj.valueOf()); // { name: 'duxin' }
toString()
toString 函數(shù)的作用是把一個邏輯轉換為字符串,并且返回 Object 類型數(shù)據(jù)的 toString()默認的返回值"[object Object]"。
如果我們在定義對象的時候,可以重寫 tosString 函數(shù),這樣 toString 的返回值可讀性會更好一些,比如:
const obj = {
name: "duxin",
toString:function(){
return this.name;
}
}
console.log(obj.valueOf()); // { name: 'duxin' }
console.log(obj.toString()); // duxin
以下這些函數(shù)都是有自定義的 toString 函數(shù):
- Array 的 toString 函數(shù)返回值是以逗號分隔的字符串;
- Function 的 toString 函數(shù)返回值是函數(shù)自身的文本定義;
- Date 的 toString 函數(shù)返回值是時間字符串;
valueOf()
valueOf 函數(shù)返回引用類型的原始值,如果沒有原始值,就返回"{}",就是空對象的字面量。
- Array的valueOf函數(shù)返回的值數(shù)組本身;
- Function的valueOf函數(shù)返回的是函數(shù)本身;
- Date的valueOf函數(shù)返回的值時間戳。
在發(fā)生數(shù)據(jù)類型轉換的時候,有l(wèi)iang兩種場景:
- 引用數(shù)據(jù)類型轉為String,先是調用toString函數(shù),有值的話,就直接返回該字符串;如果對象沒有toString,那就調用valueOf函數(shù),然后將原始值轉為字符串并且返回;如果toString或者valueOf都不能獲取原始值,那就拋出類型轉換異常;
var arr = [];
arr.toString = function () {
console.log('調用了toString()函數(shù)');
return [];
};
arr.valueOf = function () {
console.log('調用了valueOf()函數(shù)');
return [];
};
console.log(String(arr));
在執(zhí)行String(arr)的時候,是先將數(shù)組轉為字符串,調用的是toString,它的結果不能轉為string;
那就調用valueOf函數(shù),它的返回值也是一個空數(shù)組,也不能轉為字符串,那就只能拋出類型轉換異常了。
- 引用類型在轉化為number的時候,首先會判斷對象是否含有valueOf函數(shù),如果有,那就調用valueOf函數(shù),把它的返回值轉為數(shù)字,然后返回;如果沒有valueOf函數(shù),就調用toString函數(shù),將返回值轉為數(shù)字并返回。如果toString或者valueOf都不能獲取到原始值的話,那就拋出類型轉換異常。