這篇文章主要介紹Javascript隱式轉(zhuǎn)換的使用方法,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
從網(wǎng)站建設(shè)到定制行業(yè)解決方案,為提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作服務(wù)體系,各種行業(yè)企業(yè)客戶提供網(wǎng)站建設(shè)解決方案,助力業(yè)務(wù)快速發(fā)展。成都創(chuàng)新互聯(lián)將不斷加快創(chuàng)新步伐,提供優(yōu)質(zhì)的建站服務(wù)。確定兩個(gè)變量是否相等是編程中的一個(gè)非常重要的操作。
在比較字符串、數(shù)值和布爾值的相等性時(shí),問(wèn)題還比較簡(jiǎn)單。但在涉及到對(duì)象的比較時(shí),問(wèn)題就變得復(fù)雜了。最早的 ECMAScript 中的相等和不等 操作符會(huì)在執(zhí)行比較之前,先將對(duì)象轉(zhuǎn)換成相似的類型。后來(lái),有人提出了這種轉(zhuǎn)換到底是否合理的質(zhì)疑。
最后,ECMAScript 的解決方案就是提供兩組操作符:
相等和不相等——先轉(zhuǎn)換再比較,全等和不全等——僅比較而不轉(zhuǎn)換。
此處我們只對(duì)相等做一些討論。
"==" 相等 時(shí)的隱式轉(zhuǎn)換
對(duì)于 "==" 操作符,通常都會(huì)先隱式轉(zhuǎn)換(強(qiáng)制轉(zhuǎn)換),然后再比較它們的相等性。
隱式轉(zhuǎn)換規(guī)則:
1.如果有一個(gè)操作數(shù)是布爾值,則在比較相等性之前先將其轉(zhuǎn)換為數(shù)值——false 轉(zhuǎn)換為 0,而true轉(zhuǎn)換為 1;
2.如果一個(gè)操作數(shù)是字符串,另一個(gè)操作數(shù)是數(shù)值,在比較相等性之前先將字符串轉(zhuǎn)換為數(shù)值;
字符串轉(zhuǎn)換為數(shù)值:
(1)數(shù)字類型的字符串,會(huì)被轉(zhuǎn)成對(duì)應(yīng)十進(jìn)制的數(shù)值;
(2)空字符串會(huì)轉(zhuǎn)換成0;
(3)其余的全都會(huì)轉(zhuǎn)換為NaN;(NaN 與任何值都不相等,包括自身)
3.如果一個(gè)操作數(shù)是對(duì)象,另一個(gè)操作數(shù)不是,則調(diào)用對(duì)象的 valueOf()方法,用得到的基本類型值按照前面的規(guī)則進(jìn)行比較;
下面可以通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)看一下 JS 底層的轉(zhuǎn)換規(guī)則。
// 根據(jù)隱式轉(zhuǎn)換規(guī)則第三條 調(diào)用對(duì)象的 valueOf 方法 [].valueOf() // [] // 這時(shí)就變成 [] == false ,又回到原來(lái)的情況,這時(shí)JS底層又是怎么處理的呢? // 其實(shí) JS 的底層在調(diào)用 valueOf 得到的返回結(jié)果如果不是原始值時(shí),就會(huì)調(diào)用對(duì)象的 toString 方法將對(duì)象轉(zhuǎn)換成字符串。對(duì)于這個(gè)過(guò)程我們可以通過(guò)一下的例子來(lái)驗(yàn)證。 [].valueOf() // [] [].toString() // '' //上面是 這兩個(gè)方法的 默認(rèn)行為,在下面的例子中我們不改變默認(rèn)行為 [].__proto__.valueOf = () => { console.log('valueOf'); return []; } [].__proto__.toString = () => { console.log('toString'); return ''; } [] == false // 運(yùn)行的結(jié)果為 valueOf toString true // 這樣就驗(yàn)證了上述的說(shuō)明 // 我們還可以通過(guò)下面的方式,從側(cè)面在次驗(yàn)證 JS底層默認(rèn)的轉(zhuǎn)換行為 [].__proto__.valueOf = () => { console.log('valueOf'); return ''; } [].__proto__.toString = () => { console.log('toString'); return ''; } [] == false // valueOf true [].__proto__.valueOf = () => { console.log('valueOf'); return []; } [].__proto__.toString = () => { console.log('toString'); return []; } [] == false // JS 報(bào)錯(cuò) Uncaught TypeError: Cannot convert object to primitive value
現(xiàn)在我們可以來(lái)看看例子中 空對(duì)象為什么不等于 false?從正常的角度來(lái)講,數(shù)組就是一個(gè)對(duì)象,為什么空數(shù)組等于 false,而空對(duì)象為什么和 false 不相等?
//現(xiàn)在我們可以參照上面隱式轉(zhuǎn)換的過(guò)程,對(duì)空對(duì)象手動(dòng)的執(zhí)行這個(gè)過(guò)程,結(jié)果如下 ({}).valueOf() // {} ({}).toString() // '[object Object]' // 這時(shí)我們發(fā)現(xiàn) 空對(duì)象 與 空數(shù)組默認(rèn)行為的區(qū)別了,在 toString 方法上,由于數(shù)組會(huì)對(duì)繼承自對(duì)象的 toString 方法進(jìn)行重寫,將數(shù)組中的每個(gè)元素通過(guò) ',' 鏈接成一個(gè)字符串 // 這時(shí)就變成了 '[object Object]' == false // 根據(jù)規(guī)則第二條,得到最后結(jié)果 false
隱式轉(zhuǎn)換的特殊規(guī)則:
null 和 undefined 是相等的。
要比較相等性之前,不能將 null 和 undefined 轉(zhuǎn)換成其他任何值。
如果有一個(gè)操作數(shù)是 NaN,則相等操作符返回 false,而不相等操作符返回 true。
如果兩個(gè)操作數(shù)都是對(duì)象,則比較它們是不是同一個(gè)對(duì)象。(比較引用類型的地址是否相同)
null == undefined // true NaN == NaN // false NaN != NaN // true false == 0 // true undefined == 0 // true null == 0 // true
以上是Javascript隱式轉(zhuǎn)換的使用方法的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站制作公司行業(yè)資訊頻道!