空数组的布尔值到底是true还是false/比较符两边

博客讨论了在JavaScript中,空数组在布尔上下文中的值为true,但使用`==`比较时可能会出现非预期结果,因为比较操作会进行隐式类型转换。文章提醒开发者,不应将空数组与true直接比较,并提供了正确判断数组是否为空的方法。总结指出,只有空字符串、0、NaN、null和undefined的布尔值为false。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做题碰到一个bug, 用if(arr)判断数组是否为空无效, 即使是空数组也会进入if内层语句:

var arr=[];
if(arr){
	console.log('判定失效了');//总能输出
}

后来尝试打印了几次,发现问题不简单:

console.log(![]); //false
console.log(!''); //true

按照一般的惯性思路, 空数组就像空字符串, 其Boolean为false, 所以!为true.
但上面![]==false, 这跟平时想的不一样. 但难道[]的布尔值就是true了吗?
打印发现是真的, Boolean([])就是true:

console.log(Boolean([]));//true

但是接着尝试打印:

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

这四条看起来推翻了"[]的布尔值是true"这个结论, 但查资料后发现这是因为==两边的隐式转换造成的.

参考: https://www.cnblogs.com/frostbelt/p/3425498.html

原因是:任意值与布尔值比较时,都会将两边的值转化为Number
但是: 布尔值true 和 false这两个值与数字值不是一回事,因此 true 不一定等于 1,而 false 也不一定等于 0
空数组[]正是以上的一个例子, Number([])为0不代表Boolean([])不能为true了.

空数组实际上作为引用类型是个对象, 任何对象的布尔值都是true((除了null这个不算对象的对象布尔值为false之外)).

总结:

Boolean([])为true, 但不能将[]与true用== 进行比较得出结论, 因为 == 两边进行了先数字再比较的隐式转换.
记住只有以下类型的布尔值为false: 空字符串, 0和NaN, null, undefined

判断数组为空,可以用if(arr.length)或者if(arr[0]), 因为空数组里面的元素是undefined

但注意, 虽然==比较符会将两边先转化为数值再比较,但null/undefined/NaN是例外:

alert( undefined >= 0 ); // false (1)
alert( undefined < 0 ); // false (2)
alert( undefined == 0 ); // false (3)
alert( null > 0 );  // (1) false
alert( null == 0 ); // (2) false
alert( null >= 0 ); // (3) true
undefined==null;  //true

undefined 只与 null 相等,不会与其他值相等
但是相等性检查 == 和普通比较符 > < >= <= 的代码逻辑是相互独立的!
进行值的比较时,null 会被转化为数字,因此它被转化为了 0。这就是为什么null >= 0 返回值是 true;

而undefined进行转换为值时又不一样了, (1) 和 (2) 都返回 false 是因为 undefined 在比较中被转换为了 NaN,而 NaN 是一个特殊的数值型值,它与任何值进行比较都会返回 false。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值