一道面試題

寫在前面

這道題是本人在面試一家公司時的一個簡單的基礎問題,公司就不透露了,算是國內頗有名的公司,本人面試的只是實習崗位。一些大的問題就再也不說了,每一個人遇到的可能都是不同的,基本會圍繞着咱們日常所經常使用的東西來聊,下面就說一道小題:面試

題目

寫出下面幾個表達式的結果:spa

NaN == NaN
[] == false
!![] == false
{} == false
undefined == null

這道題我估計不少人都會答錯,本人就答錯了,下面就來分析分析:翻譯

  • NaN == NaN3d

這個只須要理解NaN是什麼就好,NaN表明的是Not a Number,表明的是一個不能夠表示的值,而非一個具體的值,因此NaNNaN並不相等。code

==比較的僅僅是值,而值+類型,因此==會發生隱式的類型轉換,因此有必要先來看一下ECMA規範:blog

clipboard.png

上圖是規範,下面我就來翻譯下上面說的:ip

  • undefined == null => true字符串

  • Number類型與String類型比較的話,那麼會對String類型進行類型轉換。get

  • 假如含有Boolean類型的話,會先將Boolean類型轉化爲Number類型。it

  • 假如是基本類型與引用類型比較的話,會先嚐試對引用類型進行轉化。

瞭解了這部分規範後,就能夠解決undefined == null啦,根據規範會返回true

對於引用類型的轉化,又有以下規則:

clipboard.png

簡單來講就是有兩種處理方式:

  • 假如obj instanceof Stringtrue,則會優先調用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

相關文章
相關標籤/搜索