JavaScript中if语句的真值判定问题

var a = [0];
if ([0]) { 
  console.log(a == true);
} else { 
  console.log("wut");
}

会输出 false

想知道 if 语句的真值判断是怎么的
还有

if(!!a){
    ...
}

中双感叹号的意义

我知道在其他地方双感叹号是强制转换为boolea值,但是在if语句中有什么意义

阅读 6.5k
7 个回答
if语句除了遇到undefined,null,0,'',NaN,false外其余任何东西都是true逻辑。
但是你不能认为其他的所有东西都==true
如果要这么判断的话可以在前面加两个叹号,将其转化成boolean类型,如上面所说!!a == true

关于第一个,a是数组,经过转换后才是true,不是a本身等于true。而==的隐式转换通常会转换成数值来比较。

第二个的确没意义,if本身就会有Boolean()的转换。

if里面如果不是boolean就先转换,再比较。!!是用来把值转换的,是一种语义化操作

if中传入的参数会被转换成Boolean数据类型。
数组的数据类型是Object,任何非null对象转换成Boolean均为true。

==相等操作会转换操作数(强制转型),然后再比较他们的相等性。在转换不同的数据类型时,相等操作符遵循下列基本规则:

  1. 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false 转换为0,而true 转换为1;

  2. 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;

  3. 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较;

[0] == true
先将true转为1,再将[0]转为[0].valueOf() ==> 0,所以为false。

!!双重否定,就是将a转换成相应的Boolean值。

好问题,说下我的一个‘猜测’:在数组只有一个元素的情况下,该数组会自动转化为数字类型。也即 [1]==1 ,[2]==2,[3]==3.好吧,这样就就很明了了,1==true,0==false,而2==true 返回false.对应数组[2]==true也返回false。
不过在if()判断中,如果不是undefined,=0,-0,NaN,'',null类型,应该返回true,包括[]也是返回true。
总的来说,if判断和外面的妖艳贱货是不一样的。其他的们只能等大神来解释了

第一个if的条件是个数组,数组转换为布尔值是true

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题