有时候一些JS真假判断的表达式是令人迷惑的,比如下面这种:

if (Infinity)  ;
if(NaN) ;
if ("foo");
if ({});
!!"" 

如果对上面的表达式的结果感觉不确定,请继续。
首先需要弄清JS里面的真值和假值:

什么是真值?

JavaScript 中,truthy(真值)指的是在布尔值上下文中,转换后的值为真的值。所有值都是真值,除非它们被定义为 假值(即除 false0-00n""nullundefinedNaN 以外皆为真值)。
这句话有点拗口,其实就是说,除了上边所说的8种值是falsey,其余都是真值

什么是假值?

false0-00n""nullundefinedNaN 这几种都是假值

到这里上面的一些式子就可以得到答问了:

if (Infinity)  ;//true
if(NaN) ;//false
if ("foo");//true
if ({});//true

等一下:!!是什么鬼?
我想一下啊,!表示取反,!!表示取反再取反,如果!!true表示ture的反义的反义,那不还是true吗,这算是什么骚操作?

双重非(!!)运算符

双重非运算符:显式地将任意值强制转换为其对应的布尔值

其实就是Boolean函数的另一个表达方式。那么下面这个式子就知道答案了:

!!"" //!!falsy 返回false

那这么做有什么意义呢?
下面看个例子

(error)=>{
    if(!!error.response)
    //这个表达式的意思是:response必须为真,
    //即:response!=null&&typeof(response)!='undefined'&&response!=''...
    //,与if(Boolean(error.response))同义
    {

    }
}

在这里要注意一点使用Boolean函数:不要将原始布尔值true和false与布尔对象的true和false混淆。
,因为:

var x = new Boolean(false);
if (x) {
  // 这段代码将会被执行
}
var myFalse = new Boolean(false);   // myFalse 为false的布尔对象
var g = Boolean(myFalse);       // g值为ture,因为myFalse不属于`假值`的任何一种

aquaman
6 声望2 粉丝