從相等運算符的十步計算來看類型轉換

JS 的隱式轉換給咱們帶來了很多便利,然而在一些時候,過分的使用也會致使一些不可預料的問題,好比 1 + '1' 的結果,這是一類常常要注意的簡單問題。隱式轉換屬於類型轉換的一部分,類型轉換是一個簡單而又繁雜的話題。這篇文章旨在理清楚其中的一個相關操做 相等運算符html

相等運算其中包括抽象相等(==)和嚴格相等(===),它們之間的區別僅在與,嚴格相等會直接比較類型,而不會作一些隱式轉換。其實所謂的隱式轉換,只是 EMCA 中規定的一些操做邏輯而已,今天,咱們就深刻其中,看看這層轉換的外殼之下,究竟包含這什麼。算法

相等運算符轉換規則

比較 x == yxy 都是值,返回 true 或者 false。一個比較會執行以下步驟: 注: Type[x] 理解爲 x 的類型。ToNumberToPrimitive 是類型轉換中的一種處理,後面會提到。工具

  1. 若是 Type[x]Type[y] 的類型相同,那麼執行嚴格相等比較。(因此說,能夠理解爲 ===== 的步驟之一)
  2. 若是 x 是 null 而且 y 是 undefined,那麼返回 true。
  3. 若是 x 是 undefined 而且 y 是 undefined,那麼返回 true。
  4. 若是 Type[x] 是 Number 而且 Type[y] 是 String,返回 x == !ToNumber(y) 的比較結果。
  5. 若是 Type[x] 是 String 而且 Type[y] 是 Number,返回 !ToNumber(x) == y 的比較結果。
  6. 若是 Type[x] 是 Boolean,返回 !ToNumber(x) == y 的比較結果。
  7. 若是 Type[y] 是 Boolean,返回 x == !ToNumber(y) 的比較結果。
  8. 若是 Type[x] 是 String,Number 或者 Symbol 而且 Type[y] 是 Object,返回 x == ToPrimitive[y] 的比較結果。
  9. 若是 Type[x] 是 Object而且 Type[y] 是 String,Number 或者 Symbol,返回 ToPrimitive[x] == y 的比較結果。
  10. 返回 false

化繁爲簡

上面的 10 條內容看起來頭頭是道,但是用來記憶就有諸多不便了。總結以下:ui

類型相同比較值,

nullundefined 總爲 trueNumberString,ToNumber,

如有 Boolean 也 ToNumber。

Object 要 ToPrimitive,

其餘結果返回 false複製代碼

規則搞清楚之後,只須要弄明白 ToNumberToPrimitive 是什麼就萬事大吉了。咱們先從簡單的提及,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

參考資料

  1. Abstract Equality Comparison

pic
相關文章
相關標籤/搜索