您好,登錄后才能下訂單哦!
Javascript中的valueOf與toString有什么不同?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
+{ a: 1, toString: function() { return '10' }, valueOf: function() { return '100' } }
以上引申出對象數據的轉換的問題:
所有對象繼承了兩個轉換方法:
toString(): 它的作用是返回一個反映這個對象的字符串
valueOf():它的作用是返回它相應的原始值
toString()
toString()函數的作用是返回object的字符串表示。
JavaScript中object默認的toString()方法返回字符串”[object Object]“。定義類時可以實現新的toString()方法,從而返回更加具有可讀性的結果。
JavaScript對于數組對象、函數對象、正則表達式對象以及Date日期對象均定義了更加具有可讀性的toString()方法:
Array的toString()方法將返回以逗號分隔的數組成員。
var arr = [1, 2, 3] arr.toString() // "1,2,3"
Function的toString()方法將返回函數的文本定義。
var fun = function() { return 'fun' } fun.toString() // "function() { return 'fun' }"
RegExp的toString()方法與Function的toString()方法類似,將返回正則表達式的文本定義。
var reg = /d+/g reg.toString() // "/d+/g"
Date的toString()方法將返回一個具有可讀性的日期時間字符串。
var date = new Date() date.toString() // "Tue Feb 12 2019 14:04:36 GMT+0800 (中國標準時間)"
如果Boolean值是true,則返回 “true”。否則,返回 “false”。
var boolean = true boolean.toString() // "true"
valueOf()
valueOf()函數的作用是返回該object自身。
與toString()一樣,定義類時可以實現新的valueOf()方法,從而返回需要的結果。
JavaScript對于Date對象定義了更加具有可讀性的valueOf()方法:
Date的valueOf()方法將返回一個時間戳數值,該數值為Date對象與1970年1月1日零時的時間差(以毫秒為單位)。
var date = new Date() date.valueOf() // 1549951476233
其他一律返回對象本身。
var colors = ["red", "blue", "green"] // 創建一個包含3 個字符串的數組 alert(colors.toString()) // red,blue,green alert(colors.valueOf()) // red,blue,green alert(colors) // red,blue,green
三個輸出全部一樣,那么toString()和valueOf()區別到底是什么?看下一個我寫的例子:
var arr = [1,2,3] alert(Array.isArray(arr.valueOf())) // true alert(Array.isArray(arr.toString())) // false
結果是第一個是true而第二個是false,為什么呢,其實valueOf()調用完以后還是返回一個數組。這個數組被alert的時候會調用toString()函數,所以不是valueOf()和toString()函數相同,而是間接的調用了toString()函數!
進一步測試下:
var arr = [1,2,3] arr.toString = function () { alert("調用了toString函數"); } alert(arr.valueOf()) // "調用了toString函數"
結果就是我們會看到“調用了`toString函數”。
驗證如下代碼:
var test = { value: 10, toString: function() { console.log('toString') return this.value }, valueOf: function() { console.log('valueOf') return this.value } } alert(test) // 10 toString alert(+test) // 10 valueOf alert('' + test) // 10 valueOf alert(String(test)) // 10 toString alert(Number(test)) // 10 valueOf alert(test == '10') // true valueOf alert(test === '10') // false
valueOf的意思是返回最適合該對象類型的原始值,而toString則是將在該對象類型的原始值以字符串形式返回。
示例1
alert(test) // 10 toString
這里我們的alert函數需要是的字符串,所以獲取的是字符串,而不是原始值,故而調用了toString
示例2
alert(+test) // 10 valueOf
同理,alert要的是字符串不是原始值,其實是(+test)的結果調用了toString,而+test被調用了valueOf
為了驗證我們這樣寫:
var test = { value: 1, valueOf: function () { alert("調用了test的valueOf函數") return this.value }, toString: function () { alert("調用了test的toString函數") return this.value } }; var test2 = { value: +test, valueOf: function () { alert("調用了test2的valueOf函數") return this.value; }, toString: function () { alert("調用了test2的toString函數") return this.value } }; alert(test2) // 調用了test的valueOf函數 // 調用了test2的toString函數 // 1
其中讓test2 = +test,那么即可知道結果,果然如此,調用了test的valueOf和test2的toString
示例3
alert('' + test) // 10 valueOf
同理,我們可以把上一段寫的程序里面的test2: + test改成test2:'' + test
示例4
alert(String(test)) // 10 toString
String這個強制轉換其實在其內部是調用了傳入參數的toString函數
alert(Number(test)) // 10 valueOf
alert(test == '10') // true valueOf
這個里面的判等的順序是,獲取原始值,然后判斷兩邊的原始值是否相等,所以調用valueOf
示例7
alert(test === '10') // false
===
操作符不進行隱式轉換,判全等的第一個步驟是判斷類型,因為類型都不一樣了,所以后面什么都不會調用
總結
valueOf偏向于運算,toString偏向于顯示。
在進行強轉字符串類型時將優先調用toString方法,強轉為數字時優先調用valueOf。
在有運算操作符的情況下,valueOf的優先級高于toString。
下面給大家簡單說下valueof和tostring的區別:
valueOf():返回最適合該對象類型的原始值
toString(): 將該對象的原始值以字符串形式返回
這兩個方法一般是交由JS去隱式調用,以滿足不同的運算情況。
在數值運算里,會優先調用valueOf(),如a + b
在字符串運算里,會優先調用toString(),如alert(c)
關于Javascript中的valueOf與toString有什么不同問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。