JavaScript 中的三位一體

最近看到一個有意思的圖片,包含了鮮為人知的秘密。。。

先看看這張有意思的圖片。

JavaScript 中的三位一體


圖左應該講的是基督教中的三位一體。翻譯成中文如下。

JavaScript 中的三位一體

當然這不是我們的重點,我們的重點在右邊這個圖。講的是js中相等操作。

==是js中的寬鬆相等(loose equals)。===是嚴格相等(strict equals)。

這兩個都是用來判斷兩個值是否相等。區別在於。

==允許在比較中進行強制類型轉換,而===不允許。

在轉換不同數據類型時,遵循以下幾個規則:

  • 如果有一個操作數是布爾值(true和false),會將false轉為數值0,true轉為數值1。
  • 如果一個操作符是字符串,另一個是數值。則將字符串轉成數值(ToNumber)。
  • 如果一個操作符是對象,另一個不是。則使用ToPrimitive將對象轉成基本值( 先調用對象的valueOf()方法得到基本類型,如果不能得到基本類型則調用toString()) 。再按照上面的規則進行轉換。
  • null 和 undefined 是相等的,與其他值不相等。
  • 數值NaN與任何值都不相等,包括NaN本身也不相等。
  • 如果兩個操作符都是對象,那麼比較他們是不是同一個對象引用即可。

細品上面的比較規則,品完後回到我們的三位一體js。

"\\t"!="0" 這個顯然容易看出來,類型一樣,內容不一樣。

接著看 []=="0" 和 []=="0"。一個操作符是對象,另一個不是。[].valueOf() 還是[],所以調用[].toString(),值為""。詳細比較就看下圖吧。


JavaScript 中的三位一體


對於ToNumber這個操作遵循以下規則:

  • true 轉為 1, false 轉為 0。
  • undefined 轉為 NaN , null 轉為 0。
  • 字符串"","\\n","\\t"(或者" "等其他空格組合)等空字符串總是被轉為 0。其他字符串遵循基本數字方法處理,失敗返回NaN。
  • 對於對象則使用ToPrimitive將對象轉成基本值,然後遵循上面的規則轉換。

回到我們的三位一體js,演算過程如下。


JavaScript 中的三位一體


拋開我們的三位一體,再看看其他的相等操作,遵循上面的規則去套用,應該可以明白其中的所以然了吧。

JavaScript 中的三位一體

等號看完了?再加入一些比較符號>,


JavaScript 中的三位一體


是不是有點頭暈了?先把==消化了。這些關係操作符且聽下回分解!(先挖個坑)

以上為【白玉無冰】關於"js相等操作符"的技術分享。歡迎關注公中號【白玉無冰】。如果對你有點幫助,歡迎分享給身邊的朋友。


參考書籍:

《JavaScript 高級程序設計》

《你不知道的 JavaScript》



分享到:


相關文章: