成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS中鮮為人知的問題: [] == ![]結(jié)果為true,而 {} == !{}卻為false

csRyan / 3243人閱讀

摘要:在比較字符串?dāng)?shù)值和布爾值的相等性時(shí),問題還比較簡單。但在涉及到對象的比較時(shí),問題就變得復(fù)雜了。和是相等的要比較相等性之前,不能將和轉(zhuǎn)換成其他任何值如果有一個(gè)操作數(shù)是,則相等操作符返回,而不相等操作符返回。

console.log( [] == ![] )  // true
console.log( {} == !{} )  // false

在比較字符串、數(shù)值和布爾值的相等性時(shí),問題還比較簡單。但在涉及到對象的比較時(shí),問題就變得復(fù)雜了。最早的ECMAScript中的相等和不相等操作符會(huì)在執(zhí)行比較之前,先將對象轉(zhuǎn)換成相似的類型。后來,有人提出了這種轉(zhuǎn)換到底是否合理的質(zhì)疑。最后,ECMAScript的解決方案就是提供兩組操作符:

相等和不相等——先轉(zhuǎn)換再比較? ? (==)
全等和不全等——僅比較而不轉(zhuǎn)換? (===)

ECMAScript中相等操作符由兩個(gè)等于號(hào)(==)表示,如果兩個(gè)操作數(shù)相等,則返回true,這種操作符都會(huì)先轉(zhuǎn)換操作數(shù)(通常稱為強(qiáng)制轉(zhuǎn)型),然后再比較它們的相等性

在轉(zhuǎn)換不同的數(shù)據(jù)類型時(shí),對于相等和不相等操作符:在JS高程中一書中給出如下的基本轉(zhuǎn)換規(guī)則

①、如果有一個(gè)操作數(shù)是布爾值,則在比較相等性之前先將其轉(zhuǎn)換為數(shù)值——false轉(zhuǎn)換為0,而true轉(zhuǎn)換為1;
②、如果一個(gè)操作數(shù)是字符串,另一個(gè)操作數(shù)是數(shù)值,在比較相等性之前先將字符串轉(zhuǎn)換為數(shù)值
③、如果一個(gè)操作數(shù)是對象,另一個(gè)操作數(shù)不是,則調(diào)用對象的valueOf()方法,用得到的基本類型值按照前面的規(guī)則進(jìn)行比較

這兩個(gè)操作符在進(jìn)行比較時(shí)則要遵循下列規(guī)則。
①、null 和undefined 是相等的
②、要比較相等性之前,不能將null?和?undefined?轉(zhuǎn)換成其他任何值
③、如果有一個(gè)操作數(shù)是NaN,則相等操作符返回 false ,而不相等操作符返回?true。重要提示:即使兩個(gè)操作數(shù)都是NaN,相等操作符也返回 false了;因?yàn)榘凑找?guī)則, NaN 不等于 NaN
④、如果兩個(gè)操作數(shù)都是對象,則比較它們是不是同一個(gè)對象,如果兩個(gè)操作數(shù)都指向同一個(gè)對象,則相等操作符返回?true;否則,?返回false

這里說一下題外話:[]?和 {}?都是屬于引用類型,引用類型是存放在堆內(nèi)存中的,而在棧內(nèi)存中會(huì)有一個(gè)或者多個(gè)地址來指向這個(gè)堆內(nèi)存相對應(yīng)的數(shù)據(jù)。所以在使用 ==?操作符的時(shí)候,對于引用類型的數(shù)據(jù),比較的是地址,而不是真實(shí)的值。

現(xiàn)在來探討 [] == ! [] 的結(jié)果為什么會(huì)是true

①、根據(jù)運(yùn)算符優(yōu)先級(jí) ,!?的優(yōu)先級(jí)是大于 ==?的,所以先會(huì)執(zhí)行 ![]

!可將變量轉(zhuǎn)換成boolean類型,null、undefined、NaN以及空字符串("")取反都為true,其余都為false。

所以 ! []?運(yùn)算后的結(jié)果就是 false

也就是?[] == ! []?相當(dāng)于 [] == false

②、根據(jù)上面提到的規(guī)則(如果有一個(gè)操作數(shù)是布爾值,則在比較相等性之前先將其轉(zhuǎn)換為數(shù)值——false轉(zhuǎn)換為0,而true轉(zhuǎn)換為1),則需要把 false?轉(zhuǎn)成 0

也就是?[] == ! []?相當(dāng)于 [] == false?相當(dāng)于?[] == 0

③、根據(jù)上面提到的規(guī)則(如果一個(gè)操作數(shù)是對象,另一個(gè)操作數(shù)不是,則調(diào)用對象的valueOf()方法,用得到的基本類型值按照前面的規(guī)則進(jìn)行比較,如果對象沒有valueOf()方法,則調(diào)用?toString()

而對于空數(shù)組,[].toString() ->? "" (返回的是空字符串)

也就是??[] == 0?相當(dāng)于 "" == 0

④、根據(jù)上面提到的規(guī)則(如果一個(gè)操作數(shù)是字符串,另一個(gè)操作數(shù)是數(shù)值,在比較相等性之前先將字符串轉(zhuǎn)換為數(shù)值

Number("") ->?返回的是 0

相當(dāng)于 0 == 0?自然就返回?true了

總結(jié)一下:

[] == ! []? ?->?? [] == false? ->??[] == 0? ->? ?"" == 0? ?->? 0 == 0? ?->? true
那么對于 {} == !{} 也是同理的

關(guān)鍵在于? {}.toString() ->??NaN(返回的是NaN)

根據(jù)上面的規(guī)則(如果有一個(gè)操作數(shù)是NaN,則相等操作符返回 false

總結(jié)一下:

{} == ! {}? ?->? ?{}?== false? ->? {}?== 0? ->? ?NaN?== 0? ??->? false

那么相信大家對下面的兩道題就信手拈來了

console.log( [] == !{} ) // true
console.log( {} == ![] ) // false

本文屬于magic_xiang原創(chuàng),轉(zhuǎn)載需注明來源

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/100553.html

相關(guān)文章

  • 什么 php empty 函數(shù)判斷結(jié)果空,但實(shí)際值卻非空

    摘要:為什么變量的值為字符串,但同時(shí)會(huì)是空值呢讓我們在變量上嘗試使用其它一些函數(shù)來進(jìn)行判斷吧以上結(jié)果為譯者注這邊的結(jié)果可能存在問題的結(jié)果同樣為,可以到這里去運(yùn)行下查看結(jié)果。和函數(shù)執(zhí)行結(jié)果符合預(yù)期判斷,唯獨(dú)函數(shù)返回了錯(cuò)誤結(jié)果。 本文首發(fā)于 震驚 php empty 函數(shù)判斷結(jié)果為空,但實(shí)際值卻為非空,轉(zhuǎn)載請注明出處。 最近我在一個(gè)項(xiàng)目中使用 empty 時(shí)獲取到了一些意料之外的結(jié)果。下面是我處...

    jimhs 評(píng)論0 收藏0
  • PHP下==與===區(qū)別

    摘要:因此看得出來,即使,,但是不確定的,因此,為了養(yǎng)成良好的變成習(xí)慣,避免出現(xiàn)不可預(yù)知的錯(cuò)誤,我們應(yīng)該盡量使用。的三個(gè)要點(diǎn)兩者類型不等為兩者值不等為兩者類型和值都相等為 三個(gè)要點(diǎn): 當(dāng)比較雙方同類型時(shí)二者沒有區(qū)別 當(dāng)雙方類型不一致時(shí),==的比較結(jié)果無法預(yù)知,===為false null也是一種類型 先來個(gè)樣例 if(1 == 1){ echo 1 == 1 is true....

    NikoManiac 評(píng)論0 收藏0
  • 由一個(gè)“bug”到人知jQuery.cssHooks

    摘要:干想了半天,認(rèn)為可能還是本身的寫法問題。對象提供了一種通過定義函數(shù)來獲取或設(shè)置特定值的方法。簡單來說,給我們暴露了一個(gè)鉤子,我們可以自己定義方法比如,來實(shí)現(xiàn)針對某個(gè)屬性的特定行為。 寫在最前 本次分享一下在一次jQuery賦值樣式失效的結(jié)果中來分析背后原因的過程。在翻jQuery源碼的過程中,感覺真是還不能說自己只是會(huì)用jQuery,我好像連會(huì)用都達(dá)不到(逃 歡迎關(guān)注我的博客,不定期更...

    ernest.wang 評(píng)論0 收藏0
  • 由一個(gè)“bug”到人知jQuery.cssHooks

    摘要:干想了半天,認(rèn)為可能還是本身的寫法問題。對象提供了一種通過定義函數(shù)來獲取或設(shè)置特定值的方法。簡單來說,給我們暴露了一個(gè)鉤子,我們可以自己定義方法比如,來實(shí)現(xiàn)針對某個(gè)屬性的特定行為。 寫在最前 本次分享一下在一次jQuery賦值樣式失效的結(jié)果中來分析背后原因的過程。在翻jQuery源碼的過程中,感覺真是還不能說自己只是會(huì)用jQuery,我好像連會(huì)用都達(dá)不到(逃 歡迎關(guān)注我的博客,不定期更...

    malakashi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<