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