【知識點】數(shù)據(jù)類型的轉(zhuǎn)換(隱式和顯式)

一火俄、前言

今天一個學(xué)生問了我一個問題巢墅,噢不對架谎,是一堆問題炸宵,看了幾遍聊天記錄突然不知道該從哪里回答。
干脆按照我的感覺一點一點講吧~
請看不懂的童鞋們多看幾遍

迷茫

二狐树、顯式轉(zhuǎn)換(強制轉(zhuǎn)換)

關(guān)于強制轉(zhuǎn)換,我在之前的文章已經(jīng)講過一部分了鸿脓。
一般常用的強制轉(zhuǎn)有以下幾種

1) 數(shù)值轉(zhuǎn)換函數(shù)

parseIntparseFloat抑钟,可以強制轉(zhuǎn)換其他類型為整數(shù)或浮點數(shù),如果遇到轉(zhuǎn)換不了的野哭,就直接轉(zhuǎn)換成NaN在塔。
parseInt:

   // parseInt()方法,官方解釋拨黔,將字符串轉(zhuǎn)換成一個數(shù)字整型類型
   parseInt("0.23")//Number  0
   parseInt("42.454")//Number  42
   parseInt("42.45abc4")//Number  42
   parseInt("4ab2")//Number  4
   parseInt("au3.14")//Number  NaN
   
   //看到這個有人懵逼了蛔溃,不是說好的轉(zhuǎn)換字符串變成數(shù)字的么,怎么會有數(shù)組
   //其實先將["1","21"]轉(zhuǎn)換成字符串 “1,21”,然后parseInt  就得到 1
   //其他的類型就不舉例子贺待,可以看之前的文章徽曲,數(shù)據(jù)類型的轉(zhuǎn)換
   parseInt(["1","21"])//Number  1 

parseFloat:

// parseFloat()方法,官方解釋麸塞,將字符串轉(zhuǎn)換成一個數(shù)字浮點類型
   parseFloat("0.23")//Number  0.23
   parseFloat("42.454")//Number  42.545
   parseFloat("42.45abc4")//Number  42.45
   parseFloat("42.00")//Number  42
   parseFloat("4ab2")//Number  4
   parseFloat("au3.14")//Number  NaN
   parseFloat(["1","21"])//Number  1

parseFloat和parseInt當(dāng)然還有其他用法秃臣,比如進制轉(zhuǎn)換,和本文無關(guān)哪工,不講~

2) 強制類型轉(zhuǎn)換

就是使用Number()奥此、String()Boolean()函數(shù)將其他類型強制轉(zhuǎn)換為數(shù)字雁比、字符串稚虎、布爾值。
在之前的課程已經(jīng)都講解過了偎捎。這里給大家放鏈接蠢终,可以自行去看。
http://www.reibang.com/p/3c9bc54948c8

3) toString()
  • 返回相應(yīng)值的字符串表現(xiàn)鸭限,MDN的說法是:返回一個表示該對象的字符串
  • 重點來了:每個對象都有一個 toString() 方法蜕径,當(dāng)對象被表示為文本值時或者當(dāng)以期望字符串的方式引用對象時,該方法被自動調(diào)用
  • 對于對象{}败京、Math等兜喻,toString() 返回 “[object type]”,其中type是對象類型(比如[object object]、[object Math]赡麦、[object Null]等等)朴皆。如果x不是對象,toString() 返回x應(yīng)有的文本值(不是單純的加引號泛粹,比如仔細看一下數(shù)組)遂铡。
   console.log((34).toString());//'34'
   console.log("abc".toString());//'abc'
   console.log({}.toString());//[object Object]
   console.log({"name":"lily"}.toString());//[object Object]
   console.log([].toString());//''
   console.log(["a","b",1].toString());//'a,b,1'
   console.log(["a","b",{name:"lily"}].toString());//'a,b,[object object]'
   console.log(["a","b",Math].toString());//'a,b,[object Math]'
   console.log(["a","b",undefined].toString());//'a,b,'
   console.log(["a","b",null].toString());//'a,b,'   看,其實并不是單純的加引號晶姊,而是將其文本值取了出來
   console.log(true.toString());//'a,b,'
三扒接、toString()和String()的區(qū)別
  • toString()方法;數(shù)值们衙、字符串钾怔、對象、布爾蒙挑;都有toString方法宗侦;這個方法唯一能做的就是返回相應(yīng)的字符串;其中null和undefined沒有toString()方法忆蚀;
  • String()屬于強制轉(zhuǎn)換矾利, null轉(zhuǎn)換的結(jié)果為null姑裂;undefined轉(zhuǎn)換的結(jié)果為undefined
四、valueOf()
  • valueOf() 方法返回指定對象的原始值 (數(shù)值男旗、字符串和布爾值)
  • valueOf() 方法通常由 JavaScript 在后臺自動調(diào)用舶斧,并不顯式地出現(xiàn)在代碼中
   console.log("--------")
   console.log((34).valueOf());// number 34
   console.log("abc".valueOf());// string 'abc'
   // console.log(null.valueOf());//null沒有該方法
   // console.log(undefined.valueOf());undefined沒有該方法
   console.log([].valueOf());//[]  數(shù)組類型
   console.log(true.valueOf());//true  布爾類型
   console.log([1,2,"3",{name:"lily"}].valueOf());//原數(shù)組
   console.log({}.valueOf());//{} 對象類型
   console.log({name:"lily"}.valueOf());//原對象

可是說了半天,到底是再說什么剑肯?捧毛??让网?
剛才是基礎(chǔ)呀忧,以下是重點


五、toString()和valueOf()

toString()和valueOf()這兩個方法基本是不會主動的書寫再代碼中溃睹,而是JS 在運算的過程中自己調(diào)用

  • 也就是說而账,當(dāng)我們使用一個值顯示或者計算的時候,他會自己偷偷調(diào)用toString或valueOf方法因篇。也就是我們經(jīng)撑⒎看見到隱式轉(zhuǎn)換。

那既然剛才說了竞滓,它會自動偷偷調(diào)用toString或valueOf方法咐吼,我們何不自己對對象書寫一個toString或valueOf方法,覆蓋它原來的方法來測試呢?

//定義一個對象a
var a={}
給a寫一個toString方法商佑,覆蓋它自帶的toString方法
   a.toString=function () {
       console.log("toString方法被調(diào)用");
       return 10;
   }
給a寫一個valueOf方法锯茄,覆蓋它自帶的valueOf方法
   a.valueOf=function () {
       console.log("valueOf方法被調(diào)用");
       return 20;
}

然后只要它偷偷調(diào)用這兩個方法,就會有打印茶没。
我們來試試吧~

   alert(a);//彈出10  打印toString方法被調(diào)用
   a+1;//打印valueOf方法被調(diào)用
   a+"";//打印valueOf方法被調(diào)用
   String(a);//打印toString方法被調(diào)用
   Number(a);//打印valueOf方法被調(diào)用
   Boolean(a)//打印valueOf方法被調(diào)用
   a>"5";//打印valueOf方法被調(diào)用

所以你發(fā)現(xiàn)了嗎肌幽?
如果要求的是原始值那么就會調(diào)用valueOf,如果要求的是字符串那么就會調(diào)用toString抓半。

  • alert()彈出的是字符串喂急,所以調(diào)用toString,所以你發(fā)現(xiàn)alert一個對象笛求,都是[object object]等
  • 加減乘除運算都要先使用原始值廊移,所以要調(diào)用了valueOf的方法。
六探入、總結(jié)
  • 基本上所有的JavaScript數(shù)據(jù)類型都有valueOf()狡孔,toString()方法,null除外新症,這兩個方法解決了JavaScript值運算和顯示的問題
  • valueOf()會把數(shù)據(jù)類型轉(zhuǎn)換成原始類型步氏,也就是說原來是什么類型响禽,轉(zhuǎn)換后還是什么類型徒爹,日期類型除外
  • toString()會把數(shù)據(jù)類型轉(zhuǎn)換成string類型荚醒,也就是說不管原來是什么類型,轉(zhuǎn)換后一律是string類型

這兩個方法有意思的地方在于什么時候使用隆嗅,總結(jié)如下:
1界阁、valueOf()偏向于運算(加減乘除),toString()偏向于顯示(alert)
2胖喳、強轉(zhuǎn)字符串的情況下泡躯,優(yōu)先調(diào)用toString()方法;強轉(zhuǎn)數(shù)字的情況下優(yōu)先調(diào)用valueOf()
4丽焊、正常情況下较剃,優(yōu)先調(diào)用toString()
5、在有運算操作符的情況下valueOf()的優(yōu)先級高于toString()技健,這里需要注意的是當(dāng)調(diào)用valueOf()方法無法運算后還是會再調(diào)用toString()方法


以下邊的案例結(jié)束今天的內(nèi)容吧

   //兩個{}都參加運算写穴,調(diào)用valueOf方法得到原始值
   //但是原始值還是不能參加運算,所以又調(diào)用toString方法得到'[object object]'
   console.log({}+{})//'[obeject object][obeject object]'

   // Math參加運算雌贱,調(diào)用valueof方法得到原始值
   //但是原始值不能運算啊送,要轉(zhuǎn)換成String,所以又調(diào)用toString得到[object math]
   //然后進行字符串拼接
   console.log(Math+3)//‘[object math]3’


   console.log({}+[])//'[obeject object]' []的valueOf后調(diào)用toString為空字符串
   console.log({}+"")//'[obeject object]'
   console.log([]+"")//''   空字符串
   console.log([]+3)//"3"

寫的很倉促欣孤,有時間捋順了會再次修改~
如有錯誤請指出~


拜拜馋没,晚安
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市降传,隨后出現(xiàn)的幾起案子篷朵,更是在濱河造成了極大的恐慌,老刑警劉巖搬瑰,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件款票,死亡現(xiàn)場離奇詭異,居然都是意外死亡泽论,警方通過查閱死者的電腦和手機艾少,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翼悴,“玉大人缚够,你說我怎么就攤上這事○惺辏” “怎么了谍椅?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長古话。 經(jīng)常有香客問我雏吭,道長,這世上最難降的妖魔是什么陪踩? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任杖们,我火速辦了婚禮悉抵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摘完。我一直安慰自己姥饰,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布孝治。 她就那樣靜靜地躺著列粪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谈飒。 梳的紋絲不亂的頭發(fā)上岂座,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機與錄音杭措,去河邊找鬼掺逼。 笑死,一個胖子當(dāng)著我的面吹牛瓤介,可吹牛的內(nèi)容都是我干的吕喘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼刑桑,長吁一口氣:“原來是場噩夢啊……” “哼氯质!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起祠斧,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤闻察,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后琢锋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辕漂,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年吴超,在試婚紗的時候發(fā)現(xiàn)自己被綠了钉嘹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡鲸阻,死狀恐怖跋涣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鸟悴,我是刑警寧澤陈辱,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站细诸,受9級特大地震影響沛贪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一利赋、第九天 我趴在偏房一處隱蔽的房頂上張望嗅义。 院中可真熱鬧,春花似錦隐砸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至幽纷,卻和暖如春式塌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背友浸。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工峰尝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像榛斯,于是被迫代替她去往敵國和親耀盗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348