if 判断空数组为什么为true

166 阅读2分钟

首先来看几个例子,我们再来解释原因。

let arr = [];
// 例一
if (arr) {
  console.log(true); //true
} else {
  console.log(false);
}
// 例二
if (arr.length) {
  console.log(true);
} else {
  console.log(false); //false
}

// 例三
if (arr == true) {
  console.log(true);
} else {
  console.log(false); // false
}

虽然[]是一个空数组,但它是Array构造函数的实例,即使自己没有定义新的属性或元素,但是它本身还是有一些其它属性的,比如__proto__。因此,判断一个数组是否为空,建议使用它的length属性进行判断。空对象的判断和空数组同理。

对于例三来说,其实就是类型转换。在判断两个数据是否双等的时候,如果两个数据类型不同,那么就要进行类型转换。这里的两个数据:[]true。转换流程是:首先将true转换成数字1,由于[]是引用类型,那么就调用其toString()方法,将[]转换成空字符串,空字符串再转换成0,0和1比较的结果为false

if判断中,0、null、undefined、空字符串、NaN的表现都为false。

if (0) {
  console.log(true);
} else {
  console.log(false); // false
}

if (null) {
  console.log(true);
} else {
  console.log(false); // false
}

if (undefined) {
  console.log(true);
} else {
  console.log(false); // false
}

if ('') {
  console.log(true);
} else {
  console.log(false); // false
}

if (NaN) {
  console.log(true);
} else {
  console.log(false); // false
}

“===”判定方式:

1、如果两个值类型不同,那么就一定不相等。
2、如果两个值都是数值,如果是同一个值,就相等;如果其中至少有一个是NaN,那么不相等。
3、如果两个值都是字符串,每个位置的字符都一样,那么相等;否则不等 。
4、如果两个值都是true/false,那么相等;
5、如果两个值都引用同一个函数或对象,那么相等;否则不等。
6、如果两个值都是null或者undefined,那么相等;否则不等。

“==”判定方式:

1、如果两个值类型相同,则进行===比较。
2、如果两个值类型不同,他们可能相等。根据下面的规则进行类型转换再比较:
    a. 如果一个是null,一个是undefined,那么相等。
    b. 如果一个是字符串,一个是数值,那么将字符串转换成数值再进行比较。
    c. 如果任一值是true,把它转换成1再比较;如果任一值是false,那么转换成0再比较。
    d. 如果一个是对象,另一个是数值或者字符串,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的toString或者valueOf方法。js核心内置类,会尝试valueOf优于toString,其中有一个例外是DateDate利用的是String转换,非js核心的对象,另说。
    e. 其它任何组合都不相等。