JavaScript中的很多操作都会有隐含的类型转换,这可能会导致一些违反直觉的结果。
if (xx) 的判断
JS的if语句会先对括号内的表达式求值,然后将表达式的结果转换为boolean类型再做判断。转换成boolean类型时遵循下列规则:
如果表达式的值是一个对象,返回true
如果表达式的值是一个空字符串,返回false
如果表达式的值是一个非空字符串,返回true
如果表达式的值是数值0,或NaN,返回false
如果表达式的值是任意非零数值(包括Infinity),返回true
如果表达式的值是null,返回false
如果表达式的值是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
/* 数值 */
if (0.00) {
console.log("true");
} // false
/* 对象 */
if ({}) {
console.log("true");
} // true
if ([]) {
console.log("true");
} // true
相等操作符 ==
JavaScript中有两种相等运算符,==和===
当两个操作数的类型相同时,==和===没有什么区别,
当两个操作数的类型不同时,===会直接返回false,而==会先转换操作数的类型,再比较它们是否相等。
"666" == 666 // true,转换后相等
“666" === 666 // false,因为数据类型不同
在转换操作数的类型时,==和!=遵循以下规则:
如果其中一个操作数是布尔值,则将其转换为数值——false转换为0,而true转换为1
false -- 0 // true
true -- 1 // true
如果一个操作数是字符串,而另一个是数值,则将字符串转换为数值
"" == true // false,空字符转为数值是0
"5" == 5 // true
"str" == 5 // false,"str"转换为数值是NaN
"NaN" == NaN // false,NaN不等于任何数值
如果一个操作数是对象,则现将对象转换为原始类型的值,调用对象的valueOf()方法,如果得到的还是对象则调用toString()方法转换为字符串。然后再按照上面的规则判断
[] == false // true, [].valueOf()仍返回[], [].toString返回""空字符串
[0] == true // false, 这什么鬼
["0.00"] == true // false
还有一些其他的规则
null和undefined相等
null == undefined // true
null和undefined与其他类型比较时不会转换为其他类型
null == 0 // false
undefined == 0 // false
如果有一个操作数是NaN,则==返回false;即使两个操作数都是NaN,==也返回false
NaN == NaN // false
NaN != NaN // true
如果两个操作书都是对象,则比较它们是不是同一个对象。
var obj1 = {};
var obj2 = {};
console.log(obj1 == obj2); // false
var obj1 = {};
var obj2 = obj1;
console.log(obj1 == obj2); // true
相等和严格相等
使用相等==会进行隐含的类型转换,所以建议不言使用==,只是用严格相等运算符===
0 == ''// true
1 == true // true
2 == true // false
0 == '0' // true
false == 'false' // false
false == '0' // true
' \t\r\n ' == 0 // true