類型轉換
JavaScript 是弱類型語言,所以會在任何可能的情況下應用強制類型轉換。
// 下面的比較結果是:true
new Number(10) == 10; // Number.toString() 返回的字串被再次轉換為數字
10 == '10'; // 字串被轉換為數字
10 == '+10 '; // 同上
10 == '010'; // 同上
isNaN(null) == false; // null 被轉換為數字 0
// 0 當然不是一個 NaN(譯者註:否定之否定)
// 下面的比較結果是:false
10 == 010;
10 == '-10';
ES5 提示: 以 0 開頭的數字字面值會被作為八位元字解析。
而在 ECMAScript 5 strict 模式下,這個特性被移除了。
為了避免上面複雜的強制類型轉換,強烈推薦使用嚴格的等於操作符。
雖然這可以避免大部分的問題,但 JavaScript 的弱類型系統仍然會導致一些其它問題。
內建類型的建構函式
內建類型(比如 Number 和 String)的建構函式在被調用時,使用或者不使用 new 的結果完全不同。
new Number(10) === 10; // False, 對象與數位比較
Number(10) === 10; // True, 數字與數位比較
new Number(10) + 0 === 10; // True, 由於隱式的類型轉換
使用內建類型 Number 作為建構函式將會建立一個新的 Number 對象,
而在不使用 new 關鍵字的 Number 函數更像是一個數字轉換器。
另外,在比較中引入對象的字面值將會導致更加複雜的強制類型轉換。
最好的選擇是把要比較的值顯式的轉換為三種可能的類型之一。
轉換為字串
'' + 10 === '10'; // true
將一個值加上Null 字元串可以輕鬆轉換為字串類型。
轉換為數字
+'10' === 10; // true
使用一元的加號操作符,可以把字串轉換為數字。
字串轉換為數位常用方法:
+'010' === 10
Number('010') === 10
parseInt('010', 10) === 10 // 用來轉換為整數
+'010.2' === 10.2
Number('010.2') === 10.2
parseInt('010.2', 10) === 10
轉換為布爾型
通過使用 否 操作符兩次,可以把一個值轉換為布爾型。
!!'foo'; // true
!!''; // false
!!'0'; // true
!!'1'; // true
!!'-1' // true
!!{}; // true
!!true; // true