js判断对象非空为啥可以这样?

var aaa;
var obj = {a:"a",b:"b"};
if(aaa){
    alert("aaa is null");
}
// 为啥直接 if(obj) 就可以,而不是 if(obj != null)
if(obj){
    alert("obj is not null");
}

参考
javascript判断中为假false的值

var aaa ; 这个时候的aaa 是 undefined 未定义
在if条件为null/undefined/0/NaN/""表达式时,统统被解释为false
但是 if(typeof(aaa)) 是会解析成字符串“undefine”而不是 undefined
如果写成 typeof(aaa) 可以执行 if里面的语句
而 if (obj) 因为obj 是对象 不管 obj里面内容是否为空,都会执行 if 里面的语句 ,对象定义的时候,定义了一个空对象

对于对象的判断为空,不能这样判断。

let obj1 = {kk:22}
let obj2 = {}
if(obj1){ // true
    // 执行
    console.log('obj1判断不为空'); 
}
if(obj2){ // true
    // 执行
    console.log('obj2判断不为空'); // 这是错误的
}
// 应该这样判断对象
let arr1 = Object.keys(obj1); // ["kk"]
let arr2 = Object.keys(obj2); // []

arr1.length > 0 // true
arr2.length > 0 // false

这种判断对象为空的方式是错误的
因为: if (obj == null) {},此处条件存在一个隐匿转换的问题,obj会首先执行valueOf,如果valueOf这个方法不存在的情况下,再执行toString()方法,所以当obj有值的时候会返回里面的内容出来,没有值的时候,返回的就是一个"{}",而右边null会经过Boolean()包装后,变成false,所以这最终不管obj是否有内容,obj == null,返回的都是false