alert([]==![])结果为true!求解释!

本文深入探讨了JavaScript中空数组的真假值判断及其类型转换的过程,并解释了空数组与其他类型的比较逻辑。

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

这个问题确实很奇怪,如下:

[] == false // true
![]         // false,既然[] == false,那么 !false 为什么是 false? 应该是true

接下来详细的说下这个问题:

1,[]==![] 是 [] == (![]) 也就是 obj 与 bool 对比。比较规则为:obj 调用 valueOf () 方法,其返回值与 bool 比较。比较中有bool值,将bool值转化为 0 或 1, ;字符串与数值比较,会将字符串先转化为数值。

2,如果两个操作数类型相同的话,使用(==)与(===)没有区别。全等比较除了在比较前转换类型之外,(==)与(===)没有区别,那么在两个类型相同的操作数比较时(==)与(===)没有区别;

基本上遵循这两点规则,进行说明,

[] == false ,由于需要调用对象的valueOf 方法,所以实际比较为: 
[].valueOf().toString() == false //true,由于 [].valueOf() 返回为对象,对象与bool比较,还会将对象在进行toString()转换。实际将[] 转为 "" 是 toSting()转换。
那么最重要的是知道 [] 不调用toString() ,本身到底是 真 还是 假。以最简单的方式验证:

alert(Boolean([])); //true
或下边的方式:
//1,弹出对话框,显示 1
if([]) {
    alert(1);
}
//2,弹出对话框,显示 1
if([] == false) {
    alert(1);
}
//3,报错:can't convert [] to primitive type
Array.prototype.toString = null;
if([] == false) {
    alert(1);
}
//4,弹出对话框,显示 1
Array.prototype.toString = null;
if([]) {
    alert(1);
}

那么经过这4步的验证,[] 实际为 真。

接下来就该验证 ![] 虽然没有比较,但是实际有没有调用toString() 或者 valueOf() .

Array.prototype.toString = function(){
    alert('called toString')
}
Array.prototype.valueOf = function(){
    alert('called valueOf');
}
if(![]){}; //没有输出called toString 和called valueOf,这里判断 !真

([]==![]) -> ([] == false) -> ([].toString()==false) -> (''==false) -> ('' == 0) -> (0 == 0) ->true

如果使用全等(===)的话,就不会出现这样的问题,因为不会转换类型后比较:

[]===![] // false

大概就是这样吧,可能有些地方说的不准确,大家帮完善吧。

转载于:https://www.cnblogs.com/mrxia/p/3811640.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值