小試牛刀
輸出下列數據比較結果
[] == 0; //==============================================================true [] == false; //==========================================================true [] == undefined; //======================================================false [] == null; //===========================================================false [] == ''; //=============================================================true 0 == false; //===========================================================true 0 == undefined; //=======================================================false 0 == null; //============================================================false 0 == ''; //==============================================================true false == undefined; //===================================================false false == null; //========================================================false false == ''; // =========================================================true false == 'false'; //=====================================================fasle undefined == null; //====================================================true undefined == ''; // =====================================================false undefined == 'undefined'; //=============================================false null == ''; //===========================================================false
有沒有全對呢?If the answer is "yes", congratulations!
兩個不同類型數據比較時隱式轉換規則
1) 數字和字符串、布爾類型、數組進行比較時,字符串(或布爾類型、或數組)先轉換為數字(Number),再進行比較;數組轉數字請參看后文。
123 == '123asd'; //false 123 == '123'; //true 123 == false; //false 123 == true; //false
使用 if(num) 和 if(num == true) 結果不一樣。前者使用Boolean()轉換Num, 后者使用Number轉換true。
var num = 123; if(num) { console.log(1); //輸出1 } if(num == true) { console.log(2); //無輸出 } var str = "qwe"; if(str) { console.log(1); //輸出1 } if(str == true) { console.log(2); //無輸出 }
2) 字符串和布爾類型比較,看完下面的代碼我瘋了。如果一定要給一個解釋,那么一定是進行比較的兩個數據同時經過Number()的洗禮后再進行比較。數組和布爾類型的比較也如此。
"qwe" == false; //false "qwe" == true; //false "" == false; // true "" == true; //false [] == false; //true [0] ==false; //true [00] ==false; // true [0,0] == false ; //false
3) undefined 除了和null進行非全等比較返回true,其它均返回false。null 除了和 undefined進行非全等比較返回true,其它均返回false。
4) 數組(或對象)和字符串進行比較時,數組(或對象)會轉換成字符串再進行比較。
[] == ""; //true [0] == ""; //false [0] == "0"; //true var obj = {a: 1}; obj == ""; //false obj == "[object Object]"; //true
Number() 強制轉換成數值
1) 字符串轉數值,能解析的返回數值,不能解析的返回NAN(Not a Number)。
Number('123'); //123 Number('123shj'); //NAN parseInt('123shj'); // 123
Number('\t\v\r12.34\n'); // 12.34
parseInt('\t\v\r12.34\n'); // 12
2) 布爾值轉數值
Number(true); // 1 Number(false); //0
3) Unfined 轉數值
Number('undefined'); // NAN
4) null 轉數值
Number(null); // 0
5) 對象轉數值
Number({a: 2}); // NAN
String() 強制轉換成字符串
1) 原始數據類型轉換為字符串,相當於直接把原數據用引號包起來。
String(123); // "123" String(true); // "true" String(undefined) // "undefined" String(null); // "null"
2) 對象轉字符串
Boolean() 強制轉換成布爾類型
所有對象轉換為Bool類型都為true,只有以下幾個數值轉換為Bool為false: undefined/null/0/NAN/""。
undefined == false 返回 false, Boolean(undefined) = false.
[] == false 返回true, Boolean([]) = true.
Boolean(undefined); //false Boolean(null); //false Boolean(0); //false Boolean(NAN); //false Boolean(""); //false Boolean([]); //true Boolean({}); //true Boolean(new Boolean(false)); // true
結束語
若有不足之處,歡迎指正。
參考地址
[1] 數據類型轉換.阮一峰. http://javascript.ruanyifeng.com/grammar/conversion.html
[2] http://www.jb51.net/article/34190.htm