最近看到一個有意思的圖片,包含了鮮為人知的秘密。。。
先看看這張有意思的圖片。
圖左應該講的是基督教中的三位一體。翻譯成中文如下。
當然這不是我們的重點,我們的重點在右邊這個圖。講的是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(),值為""。詳細比較就看下圖吧。
對於ToNumber這個操作遵循以下規則:
- true 轉為 1, false 轉為 0。
- undefined 轉為 NaN , null 轉為 0。
- 字符串"","\\n","\\t"(或者" "等其他空格組合)等空字符串總是被轉為 0。其他字符串遵循基本數字方法處理,失敗返回NaN。
- 對於對象則使用ToPrimitive將對象轉成基本值,然後遵循上面的規則轉換。
回到我們的三位一體js,演算過程如下。
拋開我們的三位一體,再看看其他的相等操作,遵循上面的規則去套用,應該可以明白其中的所以然了吧。
等號看完了?再加入一些比較符號>,
是不是有點頭暈了?先把==消化了。這些關係操作符且聽下回分解!(先挖個坑)
以上為【白玉無冰】關於"js相等操作符"的技術分享。歡迎關注公中號【白玉無冰】。如果對你有點幫助,歡迎分享給身邊的朋友。
參考書籍:
《JavaScript 高級程序設計》
《你不知道的 JavaScript》
閱讀更多 白玉無冰 的文章
關鍵字: 基本 程序設計 JavaScript