Javascript隐式转换
亂想
javascript為什么需要隱式轉(zhuǎn)換?如果沒有會(huì)出現(xiàn)什么情況?
找了一圈沒有看到關(guān)于這個(gè)的討論,只好自己研究了,可能不一定正確,自行辨知。
郁悶就是郁悶在好好的,為什么要搞個(gè)隱式轉(zhuǎn)換,一般來講這樣去想不太可能想出個(gè)結(jié)果,畢竟這門語(yǔ)言不是自己寫的,如果換一個(gè)問題,可能會(huì)好點(diǎn),如果沒有隱式轉(zhuǎn)換javscript會(huì)成什么樣子?
比如下面這一段代碼:
console.log("10" - 1)如果沒有隱式轉(zhuǎn)換,也許會(huì)報(bào)錯(cuò)吧?或者返回NaN?,不太確定,但假如說javascript根本不存在隱式轉(zhuǎn)換,或許你不會(huì)這樣去寫代碼吧,那么就更奇怪了,設(shè)計(jì)隱式轉(zhuǎn)換究竟何目的?目前能想到的一點(diǎn)就是因?yàn)樗且婚T動(dòng)態(tài)語(yǔ)言,值是運(yùn)行時(shí)才知道的,因此有很多不確定的因素,這可能是作者設(shè)計(jì)隱式轉(zhuǎn)換的目的吧。
什么是隱式轉(zhuǎn)換
console.log(1 + "2");//12可以看到一個(gè)是Number類型的值和一個(gè)String類型的值進(jìn)行了相加,結(jié)果是12。那為什么是12呢?如果是按照數(shù)字相加應(yīng)該是3,但這里卻是將1和2進(jìn)行了字符串拼接,也就是說這里的1被轉(zhuǎn)換成了字符串1。
結(jié)論
如果兩個(gè)值(也可以是多個(gè))的類型不同,但你卻拿它們來運(yùn)算,它們就會(huì)進(jìn)行隱式轉(zhuǎn)換,當(dāng)然也不只是運(yùn)算才會(huì)產(chǎn)生隱式轉(zhuǎn)換。
誰(shuí)被轉(zhuǎn)換
console.log(10 + "2");//102console.log(10 - "2");//8 console.log(10 * "2");//20 console.log("2" - 10);//-8 console.log(10 / "2");//5它們有一個(gè)小小的規(guī)律,如果是+號(hào),數(shù)字會(huì)被轉(zhuǎn)換成字符串,而如果是減乘除則會(huì)將字符串轉(zhuǎn)換成數(shù)字。
那么為什么唯獨(dú)+號(hào)比較特別呢,因?yàn)樵趈avascript中,+號(hào)是有兩個(gè)作用的,一個(gè)是數(shù)字相加,另一個(gè)是字符串拼接,而javscript默認(rèn)把這種情況當(dāng)成了字符串拼接。另減乘除就不存在這種問題,因此也只好將字符串轉(zhuǎn)換成數(shù)字。
哪些情況下會(huì)進(jìn)行隱式轉(zhuǎn)換
上面的幾個(gè)例子中,都是在講運(yùn)算符導(dǎo)致的隱式轉(zhuǎn)換,那么除了這種情況還有哪些情況下會(huì)進(jìn)行隱式轉(zhuǎn)換?
某些函數(shù)
isNaN():
console.log(isNaN(2)) //false console.log(isNaN("a")) //true console.log(isNaN("2")) //falseisNaN會(huì)將傳進(jìn)來的那個(gè)值進(jìn)行轉(zhuǎn)換如果能夠轉(zhuǎn)換成數(shù)字那么就是false(如果本身就是數(shù)字那么也是false),否則true。
條件判斷
if(""){console.log(true); //不會(huì)被打印 } if(" "){ console.log(true); //會(huì)被打印 }空字符串會(huì)被轉(zhuǎn)換成false,否空字符串會(huì)被轉(zhuǎn)換成true。
[0,-1,[],{},NaN,undefined,null,""," "].forEach(function(item,index){ if(item){ console.log(item); } }) // 打印的有:-1,[],{}," "也就是除,非0的數(shù)字,數(shù)組,對(duì)象,非空字符串都會(huì)被轉(zhuǎn)換成true,其他的false。
需要注意的是switch不會(huì)進(jìn)行隱式轉(zhuǎn)換
switch("5"){case 5:console.log(5); break; case "5": console.log("5"); //打印這條 break; }如果switch會(huì)進(jìn)行隱式轉(zhuǎn)換那么問題就出大了,甚至我們都不敢去使用它。那么為什么if會(huì)進(jìn)行隱式轉(zhuǎn)換,我的理解是,因?yàn)閕f它的值無非就是true跟false,而你傳進(jìn)來的不是這種類型,它自然需要進(jìn)行轉(zhuǎn)換,switch則不同,它判斷的是一個(gè)值是不是和另外一個(gè)值相等,因此它不能去轉(zhuǎn)換,換一句話說switch使用的是 === 比較。
其他類型的混合運(yùn)算
相加
console.log([]+0); //0console.log(!+0); //true console.log(!+1); //false console.log(NaN+2); //NaN console.log(NaN+"2"); //NaN2 console.log(NaN+"a"); //NaNa console.log(undefined+0); //NaN console.log(undefined+"0"); //undefined0 console.log(null+0); //0 console.log(null+"0"); //null0 console.log({}+0); //[object Object]0 console.log({}+"0"); //[object Object]0 console.log(""+0); //0 console.log(""+"0"); //0 console.log(true + 0); //1 console.log(true + "0"); //true0 console.log(false + 0); //0 console.log(false + "0"); //false0- []》 0
- !》 會(huì)將后面的那個(gè)值轉(zhuǎn)換成布爾類型,然后取反
- undefined 》 根據(jù)后面的那個(gè)值來進(jìn)行轉(zhuǎn)換,如果是數(shù)字轉(zhuǎn)換成NaN,否則字符串拼接
- {} 》 [object Object]
- true 》 1
- false 》 0
其實(shí)有一個(gè)規(guī)律,除了[],{},其他的值具體轉(zhuǎn)換是根據(jù)和它進(jìn)行運(yùn)算的那個(gè)值的類型來轉(zhuǎn)換的。
相減
console.log([]-0); //0console.log(!-0); //true console.log(!-1); //false console.log(NaN-2); //NaN console.log(NaN-"2"); //NaN console.log(NaN-"a"); //NaN console.log(undefined-0); //NaN console.log(undefined-"0"); //NaN console.log(null-0); //0 console.log(null-"0"); //0 console.log({}-0); //NaN console.log({}-"0"); //NaN console.log(""-0); //0 console.log(" "-"0"); //0 console.log("1"-"0"); //1除了相加以為,其他的幾個(gè)運(yùn)算符,主要還是將這些值轉(zhuǎn)換成數(shù)字進(jìn)行運(yùn)算,比較特殊的是!(取反),它始終轉(zhuǎn)換成的是一個(gè)布爾值。
一些有趣的事
根據(jù)這些隱式轉(zhuǎn)換,有時(shí)我們可以用它來做一些不同尋常的事,比如直接利用隱式轉(zhuǎn)換來取得一個(gè)object字符串。
console.log(({}+0).substring(1,({}+0).indexOf(" "))) //object原理因?yàn)閧}+0等于 = "[object Object]0",既然它是一個(gè)字符串,那么我們可以用字符串的方法,將其中的某個(gè)值取出來,也可以用[]的方式來取值。
也就是利用這些隱式轉(zhuǎn)換你可以取得任何字符串,甚至中文,不過需要你對(duì)javascript有點(diǎn)基礎(chǔ)罷了。
console.log(String.fromCharCode(20013)) //中取中文需要你知道對(duì)應(yīng)的字符串編碼值
隱式轉(zhuǎn)換帶來的利與弊
好處就是,我們不需要直接顯示的進(jìn)行轉(zhuǎn)換,比如你想將一個(gè)字符串轉(zhuǎn)成數(shù)字,只需要這樣:
console.log("15"-0) //數(shù)字15傳統(tǒng)的做法
console.log(parseInt("15")) //數(shù)字15但也有壞處,就是有些你并不希望進(jìn)行轉(zhuǎn)換,但它卻轉(zhuǎn)換了,而往往你容易忘了它會(huì)進(jìn)行隱式轉(zhuǎn)換這一點(diǎn),導(dǎo)致一些不太明顯的bug。
總結(jié)
大致會(huì)進(jìn)行隱式轉(zhuǎn)換的情況如下:
1、不同類型的值進(jìn)行運(yùn)算
2、判斷
3、個(gè)別函數(shù)
問答
這兩年越來越多討論關(guān)于全棧工程師的話題,而實(shí)際上所謂的全棧工程師就是早期的程序員,那時(shí)分工沒有現(xiàn)在這么明細(xì),很多活都是一個(gè)人干,后來才開始分前端后端等,現(xiàn)在又開始所謂的全棧,你怎么看?如果你想成為一個(gè)全棧工程師,你會(huì)怎么做?
轉(zhuǎn)載于:https://www.cnblogs.com/libin-1/p/6130768.html
總結(jié)
以上是生活随笔為你收集整理的Javascript隐式转换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拜登签署芯片法案 为美产业补贴527亿美
- 下一篇: Java基于springMVC的验证码案