這道題是本人在面試一家公司時的一個簡單的基礎問題,公司就不透露了,算是國內頗有名的公司,本人面試的只是實習崗位。一些大的問題就再也不說了,每一個人遇到的可能都是不同的,基本會圍繞着咱們日常所經常使用的東西來聊,下面就說一道小題:面試
寫出下面幾個表達式的結果:spa
NaN == NaN [] == false !![] == false {} == false undefined == null
這道題我估計不少人都會答錯,本人就答錯了,下面就來分析分析:翻譯
NaN == NaN
3d
這個只須要理解NaN
是什麼就好,NaN
表明的是Not a Number
,表明的是一個不能夠表示的值,而非一個具體的值,因此NaN
和NaN
並不相等。code
==
比較的僅僅是值,而值+類型,因此==
會發生隱式的類型轉換,因此有必要先來看一下ECMA
規範:blog
上圖是規範,下面我就來翻譯下上面說的:ip
undefined == null => true
字符串
Number
類型與String
類型比較的話,那麼會對String
類型進行類型轉換。get
假如含有Boolean
類型的話,會先將Boolean
類型轉化爲Number
類型。it
假如是基本類型與引用類型比較的話,會先嚐試對引用類型進行轉化。
瞭解了這部分規範後,就能夠解決undefined == null
啦,根據規範會返回true
。
對於引用類型的轉化,又有以下規則:
簡單來講就是有兩種處理方式:
假如obj instanceof String
爲true
,則會優先調用toString
假如不是String
類型,則會優先調用valueOf
方法
下面來繼續看上面的題目:
[] == false // true
[]
會首先嚐試調用valueOf
方法,[].valueOf()
返回是[]
,再調用toString
方法,[].toString()
返回的是空字符串,則比較的是'' == false
,依據規範進行轉化:
'' == Number(false) => '' == 0 Number('') == 0 => 0 == 0
對於{} == false
來講也是相同的道理,將其轉化爲[object Object] == false
,答案也很明瞭,返回的確定是false
。
再來看!![] == false
,首先來看一運算符的優先級,連接中的表格寫出了各類運算符的優先級,根據表格能夠知道的就是!
的優先級高於==
,而!!
將表達式轉化爲Boolean
類型,!![]
返回的是true
,因此!![] == false
值爲false