js中toString()與valueOf()的使用
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 函數返回值是時間字符串;
在JavaScript中,Object,Array,Function,Date等類型都實現了自定義的toString()函數。
- Object 類型數據的 toString() 函數默認的返回結果是 “[object Object]”,當我們自定義新的類時,可以重寫 toString() 函數,返回可讀性更高的結果。
- Array 的 toString() 函數返回值為以逗號分隔構成的數組成員字符串。數組也是對象,那么為什么數組返回的是對應的字符串而不是對象,其實數組覆蓋了Object.toString方法,然后將連接數組并返回一個字符串,其中包含用逗號分隔的每個數組元素(相當于Array.join())
- Function 的 toString() 函數返回值為函數的文本定義
- Date 的 toString() 函數返回值為具有可讀性的時間字符串
valueOf()
valueOf 函數返回引用類型的原始值,如果沒有原始值,就返回"{}",就是空對象的字面量。
- Array的valueOf函數返回的值數組本身;
- Function的valueOf函數返回的是函數本身;
- Date的valueOf函數返回的值時間戳。
在發(fā)生數據類型轉換的時候,有l(wèi)iang兩種場景:
引用數據類型轉為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));
在執(zhí)行String(arr)的時候,是先將數組轉為字符串,調用的是toString,它的結果不能轉為string;
那就調用valueOf函數,它的返回值也是一個空數組,也不能轉為字符串,那就只能拋出類型轉換異常了。
引用類型在轉化為number的時候,首先會判斷對象是否含有valueOf函數,如果有,那就調用valueOf函數,把它的返回值轉為數字,然后返回;如果沒有valueOf函數,就調用toString函數,將返回值轉為數字并返回。如果toString或者valueOf都不能獲取到原始值的話,那就拋出類型轉換異常。
- Object 類型數據的valueOf()函數默認的返回結果是"{}",即一個空的對象字面量。
- Array 的valueOf()函數返回的是數組本身
- function 的valueOf()函數返回的是函數本身
- Date 的valueOf()函數返回的是指定日期的時間戳
小結:
- toString() 返回的是字符串,而 valueOf() 返回的是原始值,沒有原始值返回對象本身
- undefined 和 null 都沒有 toString() 和 valueOf() 方法
- Date 類型的 toString() 返回的表示時間的字符串;valueOf() 返回的是現在到1970年1月1日的毫秒數(時間戳)
- Number 類型的 toString() 方法可以接收轉換基數,返回不同進制的字符串形式的數值;而 valueOf()方 法無法接受轉換基數
特殊情況
如果一個引用類型的值既存在 toString() 函數又存在 valueOf() 函數,那么在做隱式轉換時,會調用哪個函數呢?這里我們可以概括成兩種場景,分別是引用類型轉換為 String 類型,以及引用類型轉換為 Number 類型。
1、引用類型轉換為 String 類型
一個引用類型的數據在轉換為 String 類型時,一般是用于數據展示,轉換時遵循以下規(guī)則:
如果對象具有 toString() 函數,則會優(yōu)先調用 toString() 函數。如果它返回的是一個原始值,則會直接將這個原始值轉換為字符串表示,并返回該字符串。
反之,則會再去調用 valueOf() 函數,如果 valueOf() 函數返回的結果是一個原始值,則會將這個結果轉換為字符串表示,并返回該字符串。
如果通過 toString() 函數或者 valueOf() 函數都無法獲得一個原始值,則會直接拋出類型轉換異常。
2、引用類型轉換為 Number 類型
一個引用類型的數據在轉換為 Number 類型時,一般是用于數據運算,轉換時遵循以下規(guī)則:
如果對象具有 valueOf() 函數,則會優(yōu)先調用 valueOf() 函數,如果 valueOf() 函數返回一個原始值,則會直接將這個原始值轉換為數字表示,并返回該數字。
反之,則會再去調用 toString() 函數,如果 toString() 函數返回的結果是一個原始值,則會將這個結果轉換為數字表示,并返回該數字。
如果通過 toString() 函數或者 valueOf() 函數都無法獲得一個原始值,則會直接拋出類型轉換異常。
到此這篇關于js中toString()與valueOf()的使用的文章就介紹到這了,更多相關js toString() valueOf()內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JavaScript?Promise執(zhí)行流程深刻理解
這篇文章主要介紹了JavaScript?Promise執(zhí)行流程深刻理解,他是一個構造函數,每個創(chuàng)建的promise都有各自狀態(tài)和值,且狀態(tài)初始值為pending,值為undefined2022-06-06