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

做题碰到一个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。

Guess you like

Origin blog.csdn.net/Fky_mie/article/details/115856032