JS 的隱式轉換給咱們帶來了很多便利,然而在一些時候,過分的使用也會致使一些不可預料的問題,好比 1 + '1'
的結果,這是一類常常要注意的簡單問題。隱式轉換屬於類型轉換的一部分,類型轉換是一個簡單而又繁雜的話題。這篇文章旨在理清楚其中的一個相關操做 相等運算符。html
相等運算其中包括抽象相等(==)和嚴格相等(===),它們之間的區別僅在與,嚴格相等會直接比較類型,而不會作一些隱式轉換。其實所謂的隱式轉換,只是 EMCA 中規定的一些操做邏輯而已,今天,咱們就深刻其中,看看這層轉換的外殼之下,究竟包含這什麼。算法
比較 x == y
,x
和 y
都是值,返回 true
或者 false
。一個比較會執行以下步驟: 注: Type[x]
理解爲 x 的類型。ToNumber
和 ToPrimitive
是類型轉換中的一種處理,後面會提到。工具
Type[x]
和 Type[y]
的類型相同,那麼執行嚴格相等比較。(因此說,能夠理解爲 ===
是 ==
的步驟之一)x
是 null 而且 y
是 undefined,那麼返回 true。x
是 undefined 而且 y
是 undefined,那麼返回 true。Type[x]
是 Number 而且 Type[y]
是 String,返回 x == !ToNumber(y)
的比較結果。Type[x]
是 String 而且 Type[y]
是 Number,返回 !ToNumber(x) == y
的比較結果。Type[x]
是 Boolean,返回 !ToNumber(x) == y
的比較結果。Type[y]
是 Boolean,返回 x == !ToNumber(y)
的比較結果。Type[x]
是 String,Number 或者 Symbol 而且 Type[y]
是 Object,返回 x == ToPrimitive[y]
的比較結果。Type[x]
是 Object而且 Type[y]
是 String,Number 或者 Symbol,返回 ToPrimitive[x] == y
的比較結果。上面的 10 條內容看起來頭頭是道,但是用來記憶就有諸多不便了。總結以下:ui
類型相同比較值,
null,undefined 總爲 true。
Number,String,ToNumber,
如有 Boolean 也 ToNumber。
Object 要 ToPrimitive,
其餘結果返回 false。
複製代碼
規則搞清楚之後,只須要弄明白 ToNumber
和 ToPrimitive
是什麼就萬事大吉了。咱們先從簡單的提及,spa
ToNumber 的規則,官方給出一個表格:code
參數類型 | 結果 |
---|---|
Undefined | 返回 NaN |
Null | 返回 +0 |
Boolean | 若是 argument 是 true,返回 1,不然返回 0 |
Number | 返回 argument 沒有轉換 |
String | 參考下面的轉換算法 |
Symbol | 拋出類型錯誤 |
Object | 兩步走: 1. 轉換成基本值, ToPrimitive(argument, hint Number) 2. 返回 ToNumber() |
好了,到此爲止,彷佛對 Obejct 的比較運算處理起來須要多一步先轉換爲數字(也只能這樣),再跟具體 ToNumber
比較,由此咱們能夠進一步推測,在處理字符串,布爾值等基本數據類型的時候,應該會有 ToBoolean
或者 ToString
等等的內置工具(實際上類型轉換的規則更多具體,ECMA 中有很詳細的介紹)。這裏要挖個坑,關於上圖表格中的字符串轉換算法,我有點看不懂 ECMA 中的介紹,須要繼續研究。cdn
關於 ToPrimitive
的內容也很簡單,斷言處理輸入值,而後根據輸入類型作不一樣處理獲得基本值。htm