關(guān)于==與===的區(qū)別相信大家都很清楚啦,這理解不再贅述,今天我們來(lái)看下[]==![]的結(jié)果。
這是樓主碰到過(guò)得一個(gè)面試題,恩,華麗麗的答錯(cuò)了:
[]==[] //false,這個(gè)是常識(shí),因?yàn)樵趦蛇叾际窍嗤瑪?shù)據(jù)類型時(shí),==是直接比較兩邊數(shù)據(jù),結(jié)果為false,因?yàn)閇]屬于引用類型,在兩個(gè)[]分別指向不同的堆內(nèi)存,不熟悉的引用類型的小伙伴請(qǐng)參考樓主文章:值類型引用類型;
而當(dāng)前這題:
[]==![]//true
這個(gè)結(jié)果是怎么的出來(lái)的呢?
首先我們知道,!的優(yōu)先級(jí)要大于==的,所以先運(yùn)算右邊,![]---->結(jié)果為false,
這樣[]==![]就等價(jià)于于:
[]==false
再來(lái)看,這時(shí)候==兩邊數(shù)據(jù)類型就不相等辣,我們知道,當(dāng)==兩邊數(shù)據(jù)類型不一致時(shí),要先做數(shù)據(jù)類型轉(zhuǎn)換,再判斷,
== 類型轉(zhuǎn)換規(guī)則如下:
值類型 == 值類型 //相當(dāng)于 Number(值類型) == Number(值類型)
引用類型 == 值類型 // 對(duì)象轉(zhuǎn)化成原始類型的值,再進(jìn)行比較
比較規(guī)則:數(shù)組與數(shù)值進(jìn)行比較,會(huì)先轉(zhuǎn)成數(shù)值,再進(jìn)行比較;與字符串進(jìn)行比較,會(huì)先轉(zhuǎn)成字符串,再進(jìn)行比較;與布爾值進(jìn)行比較,兩個(gè)運(yùn)算子都會(huì)先轉(zhuǎn)成數(shù)值,然后再進(jìn)行比較。
我們知道值類型之間==:
'true' == true //false,Number('true')為NAN,Number(true)為1
那么本題值類型和引用類型之間==
[] == false //相當(dāng)于,Number([])為0,Number(false)為0,
所以0==0//true。
過(guò)程:[]==![] ----> []==false -----> 0==0 --->//true
其實(shí)更詳細(xì)還可參考知乎上的一個(gè)回答:因?yàn)?[] 是對(duì)象,比較過(guò)程依ToPrimitive([]) == false 比較。ToPrimitive 默認(rèn)是調(diào)用 toString 方法的,于是 ToPrimitice([]) 等于空字符串,即''==false,然后ToNumber('')==0,即0==0,true。附鏈接:知乎Belleve用戶回答。
相等運(yùn)算符(==)隱藏的類型轉(zhuǎn)換,會(huì)帶來(lái)一些違反直覺(jué)的結(jié)果,下面整理一些:
0 == '' // true
0 == '0' // true
2 == true // false
2 == false // false
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t\r\n ' == 0 // true
\t \r \n都是轉(zhuǎn)義字符,空格就是單純的空格,輸入時(shí)可以輸入空格
\t 的意思是 橫向跳到下一制表符位置
\r 的意思是 回車
\n 的意思是回車換行
原文鏈接:https://blog.csdn.net/qiqi_77_/article/details/79456605