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