課程視頻-JS空數據比較html
先上題,得出心中答案,打開瀏覽器點開F12,複製下面代碼,看看結果。前端
console.log( [] == ![] ) console.log( {} == !{} )
剖析一下,主要分爲:segmentfault
運算符優先級自己是一種規則,該規則在計算表達式時控制運算符執行的順序。具備較高優先級的運算符先於較低優先級的運算符執行。
先看MDN運算符優先級圖表截取:數組
優先 | 運算類型 | 關聯性 | 運算符 |
---|---|---|---|
20 | 圓括號 | n/a | (...) |
19 | new(帶參數列表) | 從左到右 | new...(...) |
函數調用 | 從左到右 | ..(..) | |
16 | 邏輯非 | 從右到左 | !... |
一元加法 | 從右到左 | +... | |
一元減法 | 從右到左 | -... | |
10 | 等號 | 從左到右 | ...==... |
6 | 邏輯與 | 從左到右 | ...&&... |
5 | 邏輯或 | 從左到右 | ...II... |
MDN完整地址瀏覽器
在截取的表格中能夠清晰的看到,邏輯非 ! 的優先級明顯高於 == 等號的有優先級,所以第一個問題,在 [] == ![] 中最優先運算的是 ![] ,而後纔是 == 比較。ide
console.log(![]) // false ,這個結果相對好理解 // 注意: !帶有隱式轉換
6種值轉化爲布爾值時爲 false 。函數
當前結論 ![] == false,固然,在使用 == 時永遠不要大意!參見附1;接下來,難題在於, [] 如何轉化進行比較。請先記住一個比較的基本規則:spa
數組與數值進行比較,會先轉成數值,再進行比較;與字符串進行比較,會先轉成字符串,再進行比較;與布爾值進行比較,兩個運算子都會先轉成數值,而後再進行比較。
附1:3d
相等運算符(==)隱藏的類型轉換,會帶來一些違反直覺的結果,下面整理一些:code
0 == '' // true 0 == '0' // true 2 == true // false 2 == false // false // 參見圖1第7條 false == 'false' // false false == '0' // true false == undefined // false false == null // false null == undefined // true ' \t\r\n ' == 0 // true // \t \r \n都是轉義字符,空格就是單純的空格,輸入時能夠輸入空格 // \t 的意思是 橫向跳到下一製表符位置 // \r 的意思是 回車 // \n 的意思是回車換行
遵循上邊的規則(左側x爲數組時),須要將 [] 與 false 一併轉化爲數字類型後再進行比較。OK,那麼這個規則是誰說的算的呢?
截取一張知乎大佬貼的Es5 規範元知識圖,下述比較參見 7 條。附2(中文版)
附2:
參照第7條:
ToNumber(false) // 0
爲啥呢?上圖
[] 依照圖2,進入第9條,使用 ToPrimitive([]) ,上圖
好吧,要根據類型默認使用 DefaultValue 方法,上圖
[] 屬於字符串hint,那麼執行 toString() ,
console.log([].toString()) // "";
終於,表達式看起來不費勁了,
"" == false ;
每次對比Es5規範很是不方便,因此
結尾總結了一下能夠快速判斷==轉化判斷依據的原則,沒必要每次都參照圖2啦 - 附3
完美
0 == 0 // true
附3
x == y特殊總結:
原始高清視頻下載
QQ答疑交流羣:
600633658
咱們的連接: