1. 程式人生 > 實用技巧 >你不知道的 JavaScript 系列中( 30 ) - 比較中的強制轉換型別

你不知道的 JavaScript 系列中( 30 ) - 比較中的強制轉換型別

var a = [ 42 ];
var b = [ "43" ];
a < b; // true
b < a; // false
比較雙方首先呼叫 ToPrimitive,如果結果出現非字串,就根據 ToNumber 規則將雙方強 制型別轉換為數字來進行比較

var a = [ "42" ];
var b = [ "043" ];
a < b; // false
如果比較雙方都是字串,則按字母順序來進行比較:

var a = [ 4, 2 ];
var b = [ 0, 4, 3 ];
a < b; // false
a轉換為"4, 2",b轉換為"0, 4, 3",同樣是按字母順序進行比較。

var a = { b: 42 };
var b = { b: 43 };
a < b; // false
a == b; // false
a > b; // false
a <= b; // true
a >= b; // true

如果a < b和a == b結果為false,為什麼a <= b和a >= b的結果會是true呢? 因為根據規範a <= b被處理為b < a,然後將結果反轉。因為b < a的結果是false,所以a <= b的結果是true。

這可能與我們設想的大相徑庭,即 <= 應該是“小於或者等於”。實際上 JavaScript 中 <= 是 “不大於”的意思(即!(a > b),處理為!(b < a))。同理a >= b處理為b <= a。

為了保證安全,應該對關係比較中的值進行顯式強制型別轉換:
var a = [ 42 ];
var b = "043";
a < b; // false -- 字串比較!
Number( a ) < Number( b ); // true -- 數字比較!