一火俄、前言
今天一個學(xué)生問了我一個問題巢墅,噢不對架谎,是一堆問題炸宵,看了幾遍聊天記錄突然不知道該從哪里回答。
干脆按照我的感覺一點一點講吧~
請看不懂的童鞋們多看幾遍
二狐树、顯式轉(zhuǎn)換(強制轉(zhuǎn)換)
關(guān)于強制轉(zhuǎn)換,我在之前的文章已經(jīng)講過一部分了鸿脓。
一般常用的強制轉(zhuǎn)有以下幾種1) 數(shù)值轉(zhuǎn)換函數(shù)
parseInt
和parseFloat
抑钟,可以強制轉(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/3c9bc54948c83) 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"
寫的很倉促欣孤,有時間捋順了會再次修改~
如有錯誤請指出~