先来看一段代码

    1. console.log([] == false); // true
    2. console.log({} == false); // false
    3. if ([]) {
    4. // 这里进来了
    5. console.log("1"); // 1
    6. }

    []、{} 与 Boolean - 图1

    没错,它进去了,[] == false 成立但是它居然进去了,为啥呢?

    因为他们隐式类型转换的方式不一样

    1. console.log([] == false); // true

    这一行呢,是调用了 [] 的 valueOf 方法,valueOf 返回的是复合类型,然后调用 toString 方法,toString 返回的是基本类型:空字符串,然后把空字符串转为 Boolean,结果为 false

    关于复合类型的转换原理可以看我写的 JS 中的 +、-、*、/ 都做了什么?

    1. [] == false;
    2. // --> Boolean("") == false
    3. // --> false == false
    4. // --> true

    我们来验证一下

    1. var a = [];
    2. a.valueOf = () => 1;
    3. console.log(a == false); // false
    4. var b = [];
    5. b.toString = () => 1;
    6. console.log(b == false); // false

    然而在 if ([]) 中没有 == 运算符,[] 就会直接转换成 Boolean

    1. if ([]) {}
    2. // --> if (Boolean([]))
    3. // --> if (true)