JavaScript中的很多操作都會(huì)有隱含的類型轉(zhuǎn)換寄月,這可能會(huì)導(dǎo)致一些違反直覺的結(jié)果窝稿。
if (xx) 的判斷
JS的if語句會(huì)先對(duì)括號(hào)內(nèi)的表達(dá)式求值,然后將表達(dá)式的結(jié)果轉(zhuǎn)換為boolean類型再做判斷碳抄。轉(zhuǎn)換成boolean類型時(shí)遵循下列規(guī)則:
如果表達(dá)式的值是一個(gè)對(duì)象箫爷,返回true
如果表達(dá)式的值是一個(gè)空字符串,返回false
如果表達(dá)式的值是一個(gè)非空字符串厢呵,返回true
如果表達(dá)式的值是數(shù)值0窝撵,或NaN,返回false
如果表達(dá)式的值是任意非零數(shù)值(包括Infinity)襟铭,返回true
如果表達(dá)式的值是null碌奉,返回false
如果表達(dá)式的值是undefined,返回false
示例:
/* 字符串 */
if ("hello") {
console.log("true");
} // true
if ("") {
console.log("true");
} // true
if (" ") {
console.log("true");
} // true
if ("0.00") {
console.log("true");
} // true
/* 數(shù)值 */
if (0.00) {
console.log("true");
} // false
/* 對(duì)象 */
if ({}) {
console.log("true");
} // true
if ([]) {
console.log("true");
} // true
相等操作符 ==
JavaScript中有兩種相等運(yùn)算符寒砖,==和===
當(dāng)兩個(gè)操作數(shù)的類型相同時(shí)赐劣,==和===沒有什么區(qū)別,
當(dāng)兩個(gè)操作數(shù)的類型不同時(shí)哩都,===會(huì)直接返回false魁兼,而==會(huì)先轉(zhuǎn)換操作數(shù)的類型,再比較它們是否相等漠嵌。
"666" == 666 // true,轉(zhuǎn)換后相等
“666" === 666 // false,因?yàn)閿?shù)據(jù)類型不同
在轉(zhuǎn)換操作數(shù)的類型時(shí)咐汞,==和!=遵循以下規(guī)則:
如果其中一個(gè)操作數(shù)是布爾值,則將其轉(zhuǎn)換為數(shù)值——false轉(zhuǎn)換為0儒鹿,而true轉(zhuǎn)換為1
false -- 0 // true
true -- 1 // true
如果一個(gè)操作數(shù)是字符串化撕,而另一個(gè)是數(shù)值,則將字符串轉(zhuǎn)換為數(shù)值
"" == true // false约炎,空字符轉(zhuǎn)為數(shù)值是0
"5" == 5 // true
"str" == 5 // false,"str"轉(zhuǎn)換為數(shù)值是NaN
"NaN" == NaN // false植阴,NaN不等于任何數(shù)值
如果一個(gè)操作數(shù)是對(duì)象蟹瘾,則現(xiàn)將對(duì)象轉(zhuǎn)換為原始類型的值,調(diào)用對(duì)象的valueOf()方法掠手,如果得到的還是對(duì)象則調(diào)用toString()方法轉(zhuǎn)換為字符串憾朴。然后再按照上面的規(guī)則判斷
[] == false // true, [].valueOf()仍返回[], [].toString返回""空字符串
[0] == true // false, 這什么鬼
["0.00"] == true // false
還有一些其他的規(guī)則
null和undefined相等
null == undefined // true
null和undefined與其他類型比較時(shí)不會(huì)轉(zhuǎn)換為其他類型
null == 0 // false
undefined == 0 // false
如果有一個(gè)操作數(shù)是NaN,則==返回false喷鸽;即使兩個(gè)操作數(shù)都是NaN众雷,==也返回false
NaN == NaN // false
NaN != NaN // true
如果兩個(gè)操作書都是對(duì)象,則比較它們是不是同一個(gè)對(duì)象魁衙。
var obj1 = {};
var obj2 = {};
console.log(obj1 == obj2); // false
var obj1 = {};
var obj2 = obj1;
console.log(obj1 == obj2); // true
相等和嚴(yán)格相等
使用相等==會(huì)進(jìn)行隱含的類型轉(zhuǎn)換报腔,所以建議不言使用==,只是用嚴(yán)格相等運(yùn)算符===
0 == ''// true
1 == true // true
2 == true // false
0 == '0' // true
false == 'false' // false
false == '0' // true
' \t\r\n ' == 0 // true