原文作者:Andy Croxall
原文鏈接:Ten Oddities And Secrets About JavaScript
翻譯編輯:張鑫旭
數據類型和定義
1. Null是個對象
JavaScript眾多類型中有個Null類型,它有個唯一的值null, 即它的字面量,定義為完全沒有任何意義的值。其表現得像個對象,如下檢測代碼:

盡管typeof值顯示是"object",但null并不認為是一個對象實例。要知道,JavaScript中的值都是對象實例,每個數值都是Number對象,每個對象都是Object對象。因為null是沒有值的,所以,很明顯,null不是任何東西的實例。因此,下面的值等于false。

實際上NaN不等于任何東西。要確認某玩意是不是NaN只能使用isNaN.
3. 無關鍵字的數組等同于false(關于Truthy和Falsy)
下面是JavaScript另一個極品怪癖:
想要知道這里發生了什么,你需要理解truthy和falsy這個概念。它們是一種true/flase字面量。在JavaScript中,所有的非Boolean型值都會內置一個boolean標志,當這個值被要求有boolean行為的時候,這個內置布爾值就會出現,例如當你要跟Boolean型值比對的時候。
因為蘋果不能和梨做比較,所以當JavaScript兩個不同類型的值要求做比較的時候,它首先會將其弱化成相同的類型。false, undefined, null, 0, "", NaN都弱化成false。這種強制轉化并不是一直存在的,只有當作為表達式使用的時候。看下面這個簡單的例子:
上面測試中,我們試圖將數值0和boolean值false做比較,因兩者的數據類型不兼容,JavaScript自動強制轉換成統一的等同的truthy和falsy,其中0等同于false(正如上面所提及的)。
你可能注意到了,上面一些等同false的值中并沒有空數組。只因空數組是個怪胚子:其本身實際上屬于truthy,但是當空數組與Boolean型做比較的時候,其行為表現又屬于falsy。不解?這是由原因的。先舉個例子驗證下空數組的奇怪脾氣:

譯者注:之所以會有這種差異,根據作者的說法,數組內置toString()方法,例如直接alert的時候,會以join(“,”)的形式彈出字符串,空數組自然就是空字符串,于是等同false。具體可參見作者另外一篇文章,《Twisted logic: understanding truthy & falsy》。不過我個人奇怪的是,像空對象,空函數,弱等于true或者false的時候都顯示false,為何?真的因為數組是個怪胎,需要特殊考慮嗎?
為避免強制轉換在比較方面的問題,你可以使用強等于(===)代替弱等于(==)。