js 空数组是true还是false

var arr = new Array();
// 或 var arr = [];

我们知道,初始化后,即使数组 arr 中没有元素,也是一个object。

typeof arr;
// "object"

既然是 object,用于判断条件时就会被转化为 true。

if(arr){
    console.log("it's true");
}
// it's true

但是,如果将 arr 与布尔值比较:

arr == false;
// true

arr == true;
// false

可是,如果把 arr 转化为 Boolean,的确是 true:

Boolean(arr);
// true

那 arr 与布尔值比较时,到底发生了什么?

原来,任意值与布尔值比较,都会将两边的值转化为 Number。

如 arr 与 false 比较,false 转化为 0,而 arr 为空数组,也转化为 0:

Number(false)
// 0

Number(arr)
// 0

所以,当空数组作为判断条件时,相当于 true。当空数组与布尔值直接比较时,相当于 false。

也就出现了以下令人绕圈的现象:

[] == ![];
// true

如何避免数组与布尔值比较时出现的坑呢?可以先把数组转化为布尔值:

Boolean(arr) == true;
// true

有同学问:

new Array() == [];

必须是 false,就和 new Array() == new Array() 一样。是不同的两个对象。

但有个问题很奇怪:

new Array(1) == false;
// true
 
// 或
 
[undefined] == false;
// true

这个怎么解释呢?Number(new Array(1)) 为什么会是 0 呢?

网友解释:

对象到数字的转换过程如下:

如果对象具有valueof()方法,后者返回一个原始值,则JavaScript将这个原始值转换为数字并返回;

否则,如果对象具有toString()方法,后者返回一个原始值,JavaScript将这个字符串转换为数字并返回;

否则,报错。

数组继承了默认的 valueOf() 方法,但是数组、函数和正则表达式调用此方法后,只返回对象本身,因此转换为数字,还会继续调用toString() 方法,空数组调用toString() 返回空字符串,转换为数字为 0,new Array(1) 同样因为虽然长度为 1,但值为 undefined,转换为数字仍未 0,所以,才会出现博主提出的疑问。

作者:xngeer

原文链接:HelloWeb前端网 » js 空数组是true还是false » 感谢您的浏览,希望能有所帮助。

欢迎您加入“Helloweb” 学习交流群:HelloWeb-学习交流群 196291215 共同交流并结识同行,在这里说出您的收获与感想或有什么不同的观点,我们期待您的留言,分享,让我们一起进步!

喜欢 ()or分享