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