先来看一段代码
console.log([] == false); // trueconsole.log({} == false); // falseif ([]) {// 这里进来了console.log("1"); // 1}
![[]、{} 与 Boolean - 图1](/uploads/projects/yusheng-foj9i@oyo184/200213c335dded39e07c449731fccef9.png)
没错,它进去了,[] == false 成立但是它居然进去了,为啥呢?
因为他们隐式类型转换的方式不一样
console.log([] == false); // true
这一行呢,是调用了 [] 的 valueOf 方法,valueOf 返回的是复合类型,然后调用 toString 方法,toString 返回的是基本类型:空字符串,然后把空字符串转为 Boolean,结果为 false
关于复合类型的转换原理可以看我写的 JS 中的 +、-、*、/ 都做了什么?
[] == false;// --> Boolean("") == false// --> false == false// --> true
我们来验证一下
var a = [];a.valueOf = () => 1;console.log(a == false); // falsevar b = [];b.toString = () => 1;console.log(b == false); // false
然而在 if ([]) 中没有 == 运算符,[] 就会直接转换成 Boolean
if ([]) {}// --> if (Boolean([]))// --> if (true)
