摘要:中默認(rèn)的方法返回字符串。的方法將返回一個具有可讀性的日期時間字符串。函數(shù)的作用是返回該自身。其他一律返回對象本身。在有運算操作符的情況下,的優(yōu)先級高于。
+{ a: 1, toString: function() { return "10" }, valueOf: function() { return "100" } }
以上引申出對象數(shù)據(jù)的轉(zhuǎn)換的問題:
所有對象繼承了兩個轉(zhuǎn)換方法:
toString(): 它的作用是返回一個反映這個對象的字符串
valueOf():它的作用是返回它相應(yīng)的原始值
toString()toString()函數(shù)的作用是返回object的字符串表示。
JavaScript中object默認(rèn)的toString()方法返回字符串”[object Object]“。定義類時可以實現(xiàn)新的toString()方法,從而返回更加具有可讀性的結(jié)果。
JavaScript對于數(shù)組對象、函數(shù)對象、正則表達(dá)式對象以及Date日期對象均定義了更加具有可讀性的toString()方法:
Array的toString()方法將返回以逗號分隔的數(shù)組成員。
var arr = [1, 2, 3] arr.toString() // "1,2,3"
Function的toString()方法將返回函數(shù)的文本定義。
var fun = function() { return "fun" } fun.toString() // "function() { return "fun" }"
RegExp的toString()方法與Function的toString()方法類似,將返回正則表達(dá)式的文本定義。
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 (中國標(biāo)準(zhǔn)時間)"
如果Boolean值是true,則返回 “true”。否則,返回 “false”。
var boolean = true boolean.toString() // "true"valueOf()
valueOf()函數(shù)的作用是返回該object自身。
與toString()一樣,定義類時可以實現(xiàn)新的valueOf()方法,從而返回需要的結(jié)果。
JavaScript對于Date對象定義了更加具有可讀性的valueOf()方法:
Date的valueOf()方法將返回一個時間戳數(shù)值,該數(shù)值為Date對象與1970年1月1日零時的時間差(以毫秒為單位)。
var date = new Date() date.valueOf() // 1549951476233
其他一律返回對象本身。
示例var colors = ["red", "blue", "green"] // 創(chuàng)建一個包含3 個字符串的數(shù)組 alert(colors.toString()) // red,blue,green alert(colors.valueOf()) // red,blue,green alert(colors) // red,blue,green
三個輸出全部一樣,那么toString()和valueOf()區(qū)別到底是什么?看下一個我寫的例子:
var arr = [1,2,3] alert(Array.isArray(arr.valueOf())) // true alert(Array.isArray(arr.toString())) // false
結(jié)果是第一個是true而第二個是false,為什么呢,其實valueOf()調(diào)用完以后還是返回一個數(shù)組。這個數(shù)組被alert的時候會調(diào)用toString()函數(shù),所以不是valueOf()和toString()函數(shù)相同,而是間接的調(diào)用了toString()函數(shù)!
進(jìn)一步測試下:
var arr = [1,2,3] arr.toString = function () { alert("調(diào)用了toString函數(shù)"); } alert(arr.valueOf()) // "調(diào)用了toString函數(shù)"
結(jié)果就是我們會看到“調(diào)用了`toString函數(shù)”。
驗證如下代碼:
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函數(shù)需要是的字符串,所以獲取的是字符串,而不是原始值,故而調(diào)用了toString
示例2alert(+test) // 10 valueOf
同理,alert要的是字符串不是原始值,其實是(+test)的結(jié)果調(diào)用了toString,而+test被調(diào)用了valueOf
為了驗證我們這樣寫:
var test = { value: 1, valueOf: function () { alert("調(diào)用了test的valueOf函數(shù)") return this.value }, toString: function () { alert("調(diào)用了test的toString函數(shù)") return this.value } }; var test2 = { value: +test, valueOf: function () { alert("調(diào)用了test2的valueOf函數(shù)") return this.value; }, toString: function () { alert("調(diào)用了test2的toString函數(shù)") return this.value } }; alert(test2) // 調(diào)用了test的valueOf函數(shù) // 調(diào)用了test2的toString函數(shù) // 1
其中讓test2 = +test,那么即可知道結(jié)果,果然如此,調(diào)用了test的valueOf和test2的toString
示例3alert("" + test) // 10 valueOf
同理,我們可以把上一段寫的程序里面的test2: + test改成test2:"" + test
示例4alert(String(test)) // 10 toString
String這個強制轉(zhuǎn)換其實在其內(nèi)部是調(diào)用了傳入?yún)?shù)的toString函數(shù)
示例5alert(Number(test)) // 10 valueOf示例6
alert(test == "10") // true valueOf
這個里面的判等的順序是,獲取原始值,然后判斷兩邊的原始值是否相等,所以調(diào)用valueOf
示例7alert(test === "10") // false
===操作符不進(jìn)行隱式轉(zhuǎn)換,判全等的第一個步驟是判斷類型,因為類型都不一樣了,所以后面什么都不會調(diào)用
總結(jié)valueOf偏向于運算,toString偏向于顯示。
在進(jìn)行強轉(zhuǎn)字符串類型時將優(yōu)先調(diào)用toString方法,強轉(zhuǎn)為數(shù)字時優(yōu)先調(diào)用valueOf。
在有運算操作符的情況下,valueOf的優(yōu)先級高于toString。
下面給大家簡單說下valueof和tostring的區(qū)別:
valueOf():返回最適合該對象類型的原始值
toString(): 將該對象的原始值以字符串形式返回
這兩個方法一般是交由JS去隱式調(diào)用,以滿足不同的運算情況。
在數(shù)值運算里,會優(yōu)先調(diào)用valueOf(),如a + b
在字符串運算里,會優(yōu)先調(diào)用toString(),如alert(c)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/101590.html
摘要:和是對象的兩個方法,你在瀏覽器后臺輸入就可以看到了它們是其中的兩個。先說一下兩個東西的用途返回對象的字符串表示。返回對象的字符串?dāng)?shù)值或布爾值表示。如果是彈窗的話,直接調(diào)用方法。至于其他情況,待續(xù) 關(guān)于javascript中的toString()和valueOf() 我GitHub上的菜鳥倉庫地址: 點擊跳轉(zhuǎn)查看其他相關(guān)文章 文章在我的博客上的地址: 點擊跳轉(zhuǎn) ? ? ? ? 關(guān)于j...
摘要:函數(shù)柯里化關(guān)于函數(shù)柯里化的問題最初是在忍者秘籍中講閉包的部分中看到的,相信很多同學(xué)見過這樣一道和柯里化有關(guān)的面試題實現(xiàn)一個函數(shù),使得如下斷言能夠能夠通過簡單說就是實現(xiàn)一個求值函數(shù),能夠?qū)⑺袇?shù)相加得出結(jié)果。方法返回一個表示該對象的字符串。 函數(shù)柯里化 ??關(guān)于函數(shù)柯里化的問題最初是在《JavaScript忍者秘籍》中講閉包的部分中看到的,相信很多同學(xué)見過這樣一道和柯里化有關(guān)的面試題:...
摘要:首先,為了掌握好類型轉(zhuǎn)換,我們要理解一個重要的抽象操作為什么說這是個抽象操作呢因為這是內(nèi)部才會使用的操作,我們不會顯示調(diào)用到?;疽?guī)則中的類型轉(zhuǎn)換總是返回基本類型值,如字符串?dāng)?shù)字和布爾值,不會返回對象和函數(shù)。 Javascript 里的類型轉(zhuǎn)換是一個你永遠(yuǎn)繞不開的話題,不管你是在面試中還是工作寫代碼,總會碰到這類問題和各種的坑,所以不學(xué)好這個那是不行滴。關(guān)于類型轉(zhuǎn)換我也看過不少的書和各...
摘要:下面分幾步來簡單的探探不同類型的轉(zhuǎn)換吧以下的內(nèi)容,都可以從權(quán)威指南中找到。其他值轉(zhuǎn)換成在編寫代碼的過程中,幾乎不用考慮它的取值類型。核心內(nèi)置類,會嘗試先于可以理解為對象優(yōu)先轉(zhuǎn)換成數(shù)字例外的是,利用的是轉(zhuǎn)換。 最近在寫公司的登錄注冊模塊,遇到類型不同相比較的時候,就心驚膽戰(zhàn),每次都要用瀏覽器來驗證一下,決定亂七八糟的隨便寫一下,方便日后自己回顧知識~ 弱類型帶來的那些讓人迷糊的事 弱類型...
摘要:文獻(xiàn)權(quán)威指南類型轉(zhuǎn)換章節(jié)對象到的具體代碼跟對象到的類似,只不過是方法的優(yōu)先級變換了,跟規(guī)則是吻合的。 javascript是一門弱類型語言,不同的基礎(chǔ)數(shù)據(jù)之間的運算自己會進(jìn)行一個相關(guān)的類型轉(zhuǎn)換,如常見的 var t = test, b = t + 12 //test12 這些常見的類型轉(zhuǎn)換比較熟悉,但是涉及到關(guān)于對象與原始值之間的運算,類型轉(zhuǎn)換規(guī)則比較特殊 基礎(chǔ)知識點: var t ...
閱讀 3064·2023-04-26 02:27
閱讀 2776·2021-11-22 13:54
閱讀 916·2021-11-12 10:36
閱讀 3772·2021-10-09 09:44
閱讀 3188·2021-10-09 09:41
閱讀 1239·2021-09-22 10:02
閱讀 2848·2019-08-30 15:56
閱讀 3115·2019-08-30 11:02