標籤:沒有 div 數字類型 自己 一些事 地方 style 點擊 之間
正題開始前我想先拋出一個問題,==和===有什麼區別?可能一般人會想,不就是後者除了比較值相等之外還會比較類型是否相等嘛,有什麼好問的,誰不知道?!但是這樣說還不夠準確,兩者的真正區別其實是==在比較的時候允許做強制類型轉換,而===不允許。好了終於引出了今天的重點,我們平時肯定遇到過強制類型轉換的時候,死活想不通為什麼要這樣轉換(為什麼這兩個相等)的情況。那麼下面我就以==為例,來說明一下其中強制類型轉換的規則。
前提知識
JavaScript中的6大類型:undefined、null、boolean、string、number、object其中又分為:原始類型(Primitive) 和 物件類型(Object)
JavaScript中的假值:undefined、null、false、+0、-0、NaN和" "
1.字串和數字相等比較
25 == "25" //true
第一種情況比較簡單,當字串和數字之間相等比較的時候,都會先將字串強制轉換成數字再比較
2.其他類型和布爾類型相等比較
"25" == false //false"0" == false //true
第二種情況,當其他類型和布爾類型相等比較的時候,都會先將布爾類型強制轉換為數字再比較。
右邊的false強制轉換為數字結果是0,然後再運用上面第一條規則,"0"強制轉換為0,所以"0" == false返回的結果是true
3.對象和非對象相等比較
"abc" == Object("abc"); //truenull == Object(null); //falseundefined == Object(undefined); //falseNaN == Object(NaN); //false
第三種情況,如果是對象(對象、函數、數組)和非對象之間相等比較時,會進行ToPrimitive操作(轉換為原始類型)。
什麼是ToPrimitive操作呢,其實ToPrimitive操作就是先執行valueOf()方法,如果結果為原始值,則返回此結果;否則,執行toString()方法,如果結果是原始值,則返回此結果;否則,拋出TypeError錯誤。
拿上面的第一個為例,Object("abc")執行ToPrimitive操作後,返回了"abc"原始值,所以結果為true。
Object(null)和Object(undefined)執行完ToPrimitive操作後和Object()是一樣的,所以結果為false。
最後一個結果為false,是因為NaN不等於NaN。
特殊情況
還有一種特殊情況,null == undefined(別問我為什麼,這個是規定)
小檢驗
false == "";false == [];"" == 0;"" == [];0 == [];"" == [null];
看了之前的分析,檢驗一下吧,看看上面幾個應該是true還是false呢?
總結
其實總結下來就三個口訣:
1.字串類型和數字類型相等比較,字串強轉數字,再比較。
2.其他類型和布爾類型相等比較,布爾類型強轉數字,再比較。
3.對象和非對象相等比較,執行ToPrimitive()操作,再比較。
有了這三個口訣(知道了轉換原理),我相信任何情況我們都不再懵逼了。
寫在最後
有一年沒有更新部落格了,回想一下,一是因為公司業務纏身,二是因為去年經曆一些事情打擊了我,其實這些也都是借口吧,最近看到強制類型轉換這個方面有點繞,正好跟大家分享一下,希望之後能夠堅持吧,多分享一些東西,對自己也是一種督促與進步吧。
最後感謝大家的閱讀,有什麼分析的不對的地方歡迎大家批評指出,如果喜歡本文,請點擊右下角的推薦哦~
帶你玩轉JavaScript中的隱式強制類型轉換