摘要:和是對(duì)象的兩個(gè)方法,你在瀏覽器后臺(tái)輸入就可以看到了它們是其中的兩個(gè)。先說一下兩個(gè)東西的用途返回對(duì)象的字符串表示。返回對(duì)象的字符串?dāng)?shù)值或布爾值表示。如果是彈窗的話,直接調(diào)用方法。至于其他情況,待續(xù)
關(guān)于javascript中的toString()和valueOf()
? ? ? ? 關(guān)于javascript中的toString()和valueOf()兩種方法,其實(shí)早在開始讀紅寶書(JavaScript高級(jí)程序設(shè)計(jì))的時(shí)候已經(jīng)有點(diǎn)困惑了,怎么搞出來這兩個(gè)這么相似的東西,重點(diǎn)是很多時(shí)候它們得到的結(jié)果都是一樣的,雖然之后不了了之覺得對(duì)應(yīng)用沒什么大影響就不管了,直到現(xiàn)在開始寫博客的時(shí)候才回頭看看這個(gè)問題。
? ? ? ? 好了,開始正文了。
? ? ? ? toString() 和 valueOf() 是對(duì)象的兩個(gè)方法,你在瀏覽器后臺(tái)輸入Object.protototype就可以看到了它們是其中的兩個(gè)。
? ? ? ? 先說一下兩個(gè)東西的用途:
? ? ? ? toString( ):返回對(duì)象的字符串表示。
? ? ? ? valueOf( ):返回對(duì)象的字符串、數(shù)值或布爾值表示。
? ? ? ? 好了,寫幾個(gè)例子就明白返回結(jié)果了(undefined ?和 null ?的值就不舉例了,因?yàn)樗鼈兌紱]有這兩個(gè)方法,所以肯定會(huì)報(bào)錯(cuò)的):
//先看看toString()方法的結(jié)果 var a = 3; var b = "3"; var c = true; var d = {test:"123",example:123} var e = function(){console.log("example");} var f = ["test","example"]; a.toString();// "3" b.toString();// "3" c.toString();// "true" d.toString();// "[object Object]" e.toString();// "function (){console.log("example");}" f.toString();// "test,example"
//再看看valueOf()方法的結(jié)果 var a = 3; var b = "3"; var c = true; var d = {test:"123",example:123} var e = function(){console.log("example");} var f = ["test","example"]; a.valueOf();// 3 b.valueOf();// "3" c.valueOf();// true d.valueOf();// {test:"123",example:123} e.valueOf();// function(){console.log("example");} f.valueOf();// ["test","example"]
? ? ? ? 很清楚了,toString( )就是將其他東西用字符串表示,比較特殊的地方就是,表示對(duì)象的時(shí)候,變成"[object Object]",表示數(shù)組的時(shí)候,就變成數(shù)組內(nèi)容以逗號(hào)連接的字符串,相當(dāng)于Array.join(",")。 而valueOf( )就返回它自身了。
? ? ? ? 至于迷惑的地方,就在于它們?cè)谑裁磿r(shí)候被調(diào)用,舉個(gè)例子:
var a = "3"; console.log(+a);//?3
? ? ? ? 當(dāng)然了,打印結(jié)果是數(shù)字3(不是字符串‘3’),因?yàn)橐辉硬僮鞣釉谧址懊婢蛯⑵滢D(zhuǎn)換為數(shù)字了(字符串轉(zhuǎn)化為數(shù)字的一種方式,相當(dāng)于Number( )方法),但是如果它應(yīng)用在對(duì)象上,過程是怎樣的呢,再舉例子:
//例子一 var?example?=?{test:"123"}; console.log(+example);// NaN //例子二 同時(shí)改寫 toString 和 valueOf 方法 var?example?=?{ toString:function(){ return "23"; }, valueOf:function(){ return "32"; } }; console.log(+example);//?32 //例子三?只改寫?toString?方法 var?example?=?{ toString:function(){ return "23"; } }; console.log(+example);//?23
? ? ? ? 通過例子一和例子二的比較,我們可以知道,一元加操作符在操作對(duì)象的時(shí)候,會(huì)先調(diào)用對(duì)象的valueOf方法來轉(zhuǎn)換,最后再用Number( )方法轉(zhuǎn)換,而通過例子二和例子三的比較,我們可以知道,如果只改寫了toString方法,對(duì)象則會(huì)調(diào)用toString方法,證明valueOf的優(yōu)先級(jí)比toString高。上面例子是多帶帶對(duì)對(duì)象上使用一元加操作符,但是,如果是字符串加對(duì)象呢?
console.log("test"+{}); //"test[object Object]"
? ? ? ? 這個(gè)很明顯,對(duì)象和字符串相加,肯定轉(zhuǎn)換為字符串啊,所以調(diào)用了對(duì)象的toString方法,變?yōu)閇object Object]了。
? ? ? ? 好了,如果是alert呢?
//例子一 var?example?=?{test:"123"}; alert(example);// "[object Object]" //例子二 同時(shí)改寫 toString 和 valueOf 方法 var?example?=?{ toString:function(){ return "23"; }, valueOf:function(){ return "32"; } }; alert(example);//?"23" //例子三?只改寫?valueOf?方法 var?example?=?{ valueOf:function(){ return "32"; } }; alert(example);// "[object Object]"
? ? ? ? 雖然上面結(jié)果我用雙引號(hào)了,但是你知道彈窗不會(huì)將字符串的雙引號(hào)表示出來的。通過上面幾個(gè)例子,我們就知道了,alert它對(duì)待對(duì)象,就和字符串和對(duì)象相加一樣,就是調(diào)用它的toString( )方法,和valueOf方法無關(guān)。
? ? ? ? 好了,總結(jié)一下,一般用操作符多帶帶對(duì)對(duì)象進(jìn)行轉(zhuǎn)換的時(shí)候,如果對(duì)象存在valueOf或toString改寫的話,就先調(diào)用改寫的方法,valueOf更高級(jí),如果沒有被改寫,則直接調(diào)用對(duì)象原型的valueOf方法。如果是彈窗的話,直接調(diào)用toString方法。至于其他情況,待續(xù)……
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/88342.html
摘要:中默認(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)換的問題:所有對(duì)象繼承了兩個(gè)轉(zhuǎn)換方法: toS...
摘要:函數(shù)柯里化關(guān)于函數(shù)柯里化的問題最初是在忍者秘籍中講閉包的部分中看到的,相信很多同學(xué)見過這樣一道和柯里化有關(guān)的面試題實(shí)現(xiàn)一個(gè)函數(shù),使得如下斷言能夠能夠通過簡(jiǎn)單說就是實(shí)現(xiàn)一個(gè)求值函數(shù),能夠?qū)⑺袇?shù)相加得出結(jié)果。方法返回一個(gè)表示該對(duì)象的字符串。 函數(shù)柯里化 ??關(guān)于函數(shù)柯里化的問題最初是在《JavaScript忍者秘籍》中講閉包的部分中看到的,相信很多同學(xué)見過這樣一道和柯里化有關(guān)的面試題:...
摘要:首先,為了掌握好類型轉(zhuǎn)換,我們要理解一個(gè)重要的抽象操作為什么說這是個(gè)抽象操作呢因?yàn)檫@是內(nèi)部才會(huì)使用的操作,我們不會(huì)顯示調(diào)用到?;疽?guī)則中的類型轉(zhuǎn)換總是返回基本類型值,如字符串?dāng)?shù)字和布爾值,不會(huì)返回對(duì)象和函數(shù)。 Javascript 里的類型轉(zhuǎn)換是一個(gè)你永遠(yuǎn)繞不開的話題,不管你是在面試中還是工作寫代碼,總會(huì)碰到這類問題和各種的坑,所以不學(xué)好這個(gè)那是不行滴。關(guān)于類型轉(zhuǎn)換我也看過不少的書和各...
摘要:通過拆箱轉(zhuǎn)換,把對(duì)象編程基本類型,再?gòu)膹幕绢愋娃D(zhuǎn)換成對(duì)應(yīng)的或者。拆箱轉(zhuǎn)換會(huì)嘗試調(diào)用和來獲得拆箱后的基本類型。 undefined和null ??Undefined類型表示未定義,它的類型只有一個(gè)值為undefined。任何變量在賦值前都是undefined類型,值為undefined。但是JS中undefined是一個(gè)變量,并非是一個(gè)關(guān)鍵字,為了避免無意中的篡改,使用void 0來獲...
摘要:下面分幾步來簡(jiǎn)單的探探不同類型的轉(zhuǎn)換吧以下的內(nèi)容,都可以從權(quán)威指南中找到。其他值轉(zhuǎn)換成在編寫代碼的過程中,幾乎不用考慮它的取值類型。核心內(nèi)置類,會(huì)嘗試先于可以理解為對(duì)象優(yōu)先轉(zhuǎn)換成數(shù)字例外的是,利用的是轉(zhuǎn)換。 最近在寫公司的登錄注冊(cè)模塊,遇到類型不同相比較的時(shí)候,就心驚膽戰(zhàn),每次都要用瀏覽器來驗(yàn)證一下,決定亂七八糟的隨便寫一下,方便日后自己回顧知識(shí)~ 弱類型帶來的那些讓人迷糊的事 弱類型...
閱讀 2479·2021-09-30 09:47
閱讀 3034·2019-08-30 11:05
閱讀 2639·2019-08-29 17:20
閱讀 2050·2019-08-29 13:01
閱讀 1809·2019-08-26 13:39
閱讀 1421·2019-08-26 13:26
閱讀 3305·2019-08-23 18:40
閱讀 1969·2019-08-23 17:09