摘要:中默認的方法返回字符串。的方法將返回一個具有可讀性的日期時間字符串。函數的作用是返回該自身。其他一律返回對象本身。在有運算操作符的情況下,的優先級高于。
+{ 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則是將在該對象類型的原始值以字符串形式返回。
示例1alert(test) // 10 toString
這里我們的alert函數需要是的字符串,所以獲取的是字符串,而不是原始值,故而調用了toString
示例2alert(+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
示例3alert("" + test) // 10 valueOf
同理,我們可以把上一段寫的程序里面的test2: + test改成test2:"" + test
示例4alert(String(test)) // 10 toString
String這個強制轉換其實在其內部是調用了傳入參數的toString函數
示例5alert(Number(test)) // 10 valueOf示例6
alert(test == "10") // true valueOf
這個里面的判等的順序是,獲取原始值,然后判斷兩邊的原始值是否相等,所以調用valueOf
示例7alert(test === "10") // false
===操作符不進行隱式轉換,判全等的第一個步驟是判斷類型,因為類型都不一樣了,所以后面什么都不會調用
總結valueOf偏向于運算,toString偏向于顯示。
在進行強轉字符串類型時將優先調用toString方法,強轉為數字時優先調用valueOf。
在有運算操作符的情況下,valueOf的優先級高于toString。
下面給大家簡單說下valueof和tostring的區別:
valueOf():返回最適合該對象類型的原始值
toString(): 將該對象的原始值以字符串形式返回
這兩個方法一般是交由JS去隱式調用,以滿足不同的運算情況。
在數值運算里,會優先調用valueOf(),如a + b
在字符串運算里,會優先調用toString(),如alert(c)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/101590.html
摘要:和是對象的兩個方法,你在瀏覽器后臺輸入就可以看到了它們是其中的兩個。先說一下兩個東西的用途返回對象的字符串表示。返回對象的字符串數值或布爾值表示。如果是彈窗的話,直接調用方法。至于其他情況,待續 關于javascript中的toString()和valueOf() 我GitHub上的菜鳥倉庫地址: 點擊跳轉查看其他相關文章 文章在我的博客上的地址: 點擊跳轉 ? ? ? ? 關于j...
摘要:函數柯里化關于函數柯里化的問題最初是在忍者秘籍中講閉包的部分中看到的,相信很多同學見過這樣一道和柯里化有關的面試題實現一個函數,使得如下斷言能夠能夠通過簡單說就是實現一個求值函數,能夠將所有參數相加得出結果。方法返回一個表示該對象的字符串。 函數柯里化 ??關于函數柯里化的問題最初是在《JavaScript忍者秘籍》中講閉包的部分中看到的,相信很多同學見過這樣一道和柯里化有關的面試題:...
摘要:首先,為了掌握好類型轉換,我們要理解一個重要的抽象操作為什么說這是個抽象操作呢因為這是內部才會使用的操作,我們不會顯示調用到。基本規則中的類型轉換總是返回基本類型值,如字符串數字和布爾值,不會返回對象和函數。 Javascript 里的類型轉換是一個你永遠繞不開的話題,不管你是在面試中還是工作寫代碼,總會碰到這類問題和各種的坑,所以不學好這個那是不行滴。關于類型轉換我也看過不少的書和各...
摘要:下面分幾步來簡單的探探不同類型的轉換吧以下的內容,都可以從權威指南中找到。其他值轉換成在編寫代碼的過程中,幾乎不用考慮它的取值類型。核心內置類,會嘗試先于可以理解為對象優先轉換成數字例外的是,利用的是轉換。 最近在寫公司的登錄注冊模塊,遇到類型不同相比較的時候,就心驚膽戰,每次都要用瀏覽器來驗證一下,決定亂七八糟的隨便寫一下,方便日后自己回顧知識~ 弱類型帶來的那些讓人迷糊的事 弱類型...
摘要:文獻權威指南類型轉換章節對象到的具體代碼跟對象到的類似,只不過是方法的優先級變換了,跟規則是吻合的。 javascript是一門弱類型語言,不同的基礎數據之間的運算自己會進行一個相關的類型轉換,如常見的 var t = test, b = t + 12 //test12 這些常見的類型轉換比較熟悉,但是涉及到關于對象與原始值之間的運算,類型轉換規則比較特殊 基礎知識點: var t ...
閱讀 3046·2023-04-26 02:27
閱讀 2763·2021-11-22 13:54
閱讀 902·2021-11-12 10:36
閱讀 3753·2021-10-09 09:44
閱讀 3178·2021-10-09 09:41
閱讀 1223·2021-09-22 10:02
閱讀 2833·2019-08-30 15:56
閱讀 3106·2019-08-30 11:02