1、undefined == null // true
這個奇葩我也不知道爲什麼就相等了。畢竟在進行類型轉換的時候都是轉換爲數字,undefined
轉換爲數字是 NaN
,null
轉換爲數字是0
2、null == 0 // false
null
有屬於自己的類型 Null
,而不屬於Object
類型,typeof
之所以會判定爲 Object
類型,是因爲JavaScript
數據類型在底層都是以二進制的形式表示的,二進制的前三位爲0 會被 typeof 判斷爲對象類型
,而null 的二進制位恰好都是 0
,因此,null 被誤判斷爲 Object 類型。
因爲null
在JS 渲染引擎裏面是轉換爲 object
對象,對象轉換爲原始類型使用的是 toString()
或者是 valueOf()
,但是null
沒有 toString()和 valueOf()
,所以沒辦法用下面的方法進行轉換,具體爲什麼,我也不是很清楚。知道的話告訴我一下。
- 對象轉換成字符串 的過程
- 如果對象具有
toString()
方法,則調用這個方法,如果返回一個原始值,Javascript
將這個值轉換爲字符串,並返回這個字符串結果。 - 如果對象沒有
toString()
,或者這個方法並不返回一個原始值,那麼JavaScript
會調用valueOf()方法
,如果存在這個方法,則JS 會調用它,如果返回值是原始值,javaScript
將這個值轉換爲字符串,並返回這個字符串的結果。 - 否則,
javascript
無法從toString()或valueOf()
獲得一個原始值,因此這時它將拋出一個類型錯誤異常。
- 如果對象具有
- 對象轉換爲數字 的過程
- 它會首先嚐試使用valueOf()
方法:
- 如果對象具有valueOf()
方法,後者返回一個原始值,則javaScript
將這個原始值轉換爲數字並返回數字
- 如果對象具有toString()方法
,後者返回一個原始值,則JavaScript
將其轉換並返回。(對象的toString()
方法返回一個字符串直接量,JS將字符串轉換爲數字類型,並返回這個數字)
3、undefined == false // false
- 需要注意的是: 一個值轉換爲另一個值並不意味着兩個值相等。比如,入股在期望使用布爾值的地方使用
undefined
它將會轉換爲false
,但這不表明undefined == false
。 if語句將undefined
轉換爲false
,但==
運算符並不試圖將其操作數轉換爲布爾值。!!!
4、包裝類與原始值
- JS會在必要時將包裝類轉換爲原始值, ”==“ 運算符將原始值和其包裝類對象視爲相等,但是 “===” 全等於運算符將他們視爲不等,因爲 通過
typeof
可以看到原始值和其包裝類的不同。。