js為什么[]==![]是成立的嗎
前言
js是一門弱類型的語(yǔ)言,它的強(qiáng)制類型轉(zhuǎn)換的迷惑性也被人詬病,例如標(biāo)題提到的一個(gè)小例子,我想可能很難再找到其他的語(yǔ)言,允許我們覺到一個(gè)值似乎既為真也為假。
其實(shí)現(xiàn)在規(guī)范更推薦js開發(fā)者們避免使用 == 這種會(huì)產(chǎn)生強(qiáng)制類型轉(zhuǎn)換的語(yǔ)法,大家盡可能會(huì)用 === 來代替,我在工作中也確實(shí)如此。
這里涉及到強(qiáng)制類型轉(zhuǎn)換的問題,由于js的類型設(shè)計(jì)如此,它并不是難用,而是容易出現(xiàn)讓人難以理解的內(nèi)容,所以被很多人詬病。其實(shí)遇到任何問題,第一時(shí)間不應(yīng)該是回避,而是應(yīng)該試著去了解它,理解了也就不會(huì)迷惑了。
我想你也想解除一下自己的迷惑吧?本文就來給介紹一下關(guān)于==的類型轉(zhuǎn)換問題。
== 與 === 的區(qū)別
這時(shí)候,如果你有經(jīng)驗(yàn),你肯定會(huì)說:這個(gè)我知道,== 只判斷值,=== 會(huì)同時(shí)判斷值和類型
這么理解也許可以,但是嚴(yán)格來說,這句話不夠準(zhǔn)確,真正的區(qū)別應(yīng)該是:== 在比較兩個(gè)不同類型的值時(shí)會(huì)發(fā)生強(qiáng)制類型轉(zhuǎn)換,而 === 不會(huì)
強(qiáng)制類型轉(zhuǎn)換
然后怎么轉(zhuǎn)換呢?記一下以下幾點(diǎn)就完了。
前置條件是兩者類型不同,
- 兩者如果是表達(dá)式,先計(jì)算表達(dá)式。
- 兩者中有一個(gè)是對(duì)象類型,則該對(duì)象類型執(zhí)行ToPrimitive后再進(jìn)行比較。
- 兩者都是基本類型,判斷類型是否相同,不同,則同時(shí)執(zhí)行ToNumber后再比較。
- 特殊情況,null == underfined,兩者在 == 比較中只與對(duì)方和自己本身相等。
ToPimitive:執(zhí)行該對(duì)象的valueOf函數(shù),如果結(jié)果為基本類型則直接返回,否則返回該對(duì)象的toString函數(shù)的執(zhí)行結(jié)果。
ToNumber:轉(zhuǎn)化為數(shù)字類型。
例子
ok,知道了以上的內(nèi)容,我們來看看[]==![]發(fā)生了什么。
[] == ![] // 右邊是表達(dá)式,先進(jìn)行計(jì)算,[]的boolean值為true,所以![]則為false
// ???
[] == false // 右邊是基本類型,左邊則是數(shù)組(對(duì)象類型),因此對(duì)左側(cè)執(zhí)行ToPrimitive
// ???
// ToPrimitive執(zhí)行過程
[].valueOf() // 結(jié)果為[],valueOf返回的仍然是原數(shù)組對(duì)象,非基本類型,執(zhí)行ToString
[].toString() // 結(jié)果為空字符串'',為字符串基本類型,返回
'' == false // 兩邊都為基本類型,類型仍然不同,兩邊同時(shí)執(zhí)行ToNumber
// ???
// 兩邊同時(shí)ToNumber轉(zhuǎn)化為數(shù)字類型
Number('') // 0
Number(false) // 0
0 == 0 // true哈哈哈,雖然很扯淡,但是結(jié)果就是這樣的。
練習(xí)
試試,根據(jù)上方學(xué)習(xí)到的知識(shí),能不能嘗試讓自己理解以下的等式為什么是true呢?
console.log('0' == false) // true
console.log(0 == false) // true
console.log('' == false) // true
console.log([] == false) // true
console.log('' == 0) // true
console.log('' == []) // true
console.log(0 == []) // true
特殊情況undefined==null
雖然兩者都是基本類型,可是遇到它們時(shí)要特殊處理,不可以使用Number進(jìn)行轉(zhuǎn)換,兩者在==中只與彼此和自身相等,因此進(jìn)行上方步驟判斷時(shí),不要忘了遇到null和undefined,不要再繼續(xù)轉(zhuǎn)換了。
而且根據(jù)這個(gè)特殊性質(zhì),當(dāng)我們需要判斷一個(gè)值為undefined或者null時(shí),完全可以簡(jiǎn)化判斷,這不是很好嗎?
if (res === undefined || res === null) {
? ? // ...
}
// 等同于
if (res == null) {
? ? // ...
}尾言
本文介紹了==的強(qiáng)制類型轉(zhuǎn)換,雖然我知道這在工作中實(shí)用性不大,哈哈哈,不過就當(dāng)是滿足一下自己的求知欲吧。更多相關(guān)js []==![]內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
原生JavaScript實(shí)現(xiàn)五子棋游戲
這篇文章主要為大家詳細(xì)介紹了原生JavaScript實(shí)現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11
微信小程序?qū)崿F(xiàn)登陸注冊(cè)滑塊驗(yàn)證
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)登陸注冊(cè)滑塊驗(yàn)證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
js中AppendChild與insertBefore的用法詳細(xì)解析
這篇文章主要是對(duì)js中AppendChild與insertBefore的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-12-12
JavaScript Event學(xué)習(xí)第十章 一些可替換的事件對(duì)
為了讓我們的JavaScript驅(qū)動(dòng)的頁(yè)面對(duì)那些不能或者不想使用鼠標(biāo)的用戶也能很好的使用,我們對(duì)于像mouseover和click這樣的事件做一些處理,同樣的,對(duì)于非鼠標(biāo)事件也同樣的要我們的腳本執(zhí)行。2010-02-02
javascript結(jié)合fileReader 實(shí)現(xiàn)上傳圖片
FileReader具體支持哪些方法和事件,這里就不介紹了,有興趣的可以去w3c官網(wǎng)上看看FileReader介紹,這里主要介紹一下FileReader常見應(yīng)用,以及fileReader 實(shí)現(xiàn)上傳圖片示例分享。2015-01-01

