說出如下幾個表達式的結果javascript
var obj1 = { name: '張三'} var obj2 = obj1 var obj3 = { name: '張三'} null == undefined 123 == '123' false == 0 NaN == false obj1 == obj2 obj1 == obj3
要想回答上述問題,必須理解js在執行==
時候的一些數據轉換規則和成文的規定。ECMA-262對==
的約定以下:java
若是x和y的類型相同,函數
若是x是Numberspa
你可能注意到了這樣兩個函數3d
參數類型 | 結果 |
---|---|
Undefined | NaN |
Null | +0 |
Boolean | true爲1,false爲+0 |
Number | 參數自己 |
String | 簡單理解,能轉換成數字的就會轉換成數字,好比數字字符串,十六進制的數字等,轉換失敗則返回NaN(詳見ECMA-262-9.3.1,內容較多,不展開敘述) |
Object | 兩步轉換操做:1. ToPrimitive(input argument, hint Number) 2. ToNumber() |
參數類型 | 結果 |
---|---|
Undefined | 輸入值 |
Null | 輸入值 |
Boolean | 輸入值 |
Number | 輸入值 |
String | 輸入值 |
Object | 調用DefaultValue方法 |
好吧,又多了一個DefaultValue方法code
細心的你發現上面ToNumber對於Object的轉換裏有這麼一句ToPrimitive(input argument, hint Number)
,就是說調用ToPrimitive的時候,除了傳入要轉化的值,還傳了一個hint參數,這個參數能夠爲Number,也能夠爲String。那麼何時傳入這兩個參數,同時又有啥區別?對象
hint Number
:valueOf
,若是返回值是原始值,則返回原始值toString
,若是返回值是原始值,則返回原始值hint String
:toString
,若是返回值是原始值,則返回原始值valueOf
,若是返回值是原始值,則返回原始值若是input argument是內置的Date類型,則參數是hint String
,不然默認hint Number
。blog
說了這麼多,咱們回到上面的題目,一一解答:ip
null == undefined
。根據上面第二條,寫的明明白白,結果是true。123 == '123'
。根據上面第四條return 123 == ToNumber('123')
,而ToNumber('123')
的結果爲123,因此return 123 == 123
,根據1-3-3,返回true。false == 0
。根據上面第六條,return ToNumber(false) == 0
,而ToNumber(false)
的值爲+0,因此+0 == 0
,根據1-3-3,返回true。NaN == false
。看到不少別的同窗說這裏是作了各類類型轉換,其實我認爲這裏是因爲沒有匹配到任何規則,因此根據第十條返回false,也就是說並無作什麼類型轉換。obj1 == obj2
。根據1-6,因爲obj1和obj2指向同一個引用,因此返回true。obj1 == obj3
。根據1-6,因爲obj1和obj2指向不一樣引用,因此返回false。把上面題目中的==
換成===
,試問結果會發生怎樣的變化?這裏我就不說了,推理方式同上,根據以下規則,答案請各位看官自行補充。字符串
若是x是Number