是什么 !!(不是)JavaScript中的运算符?

我看到了一些代码,它们似乎使用了我不认识的运算符,它们以两个感叹号的形式出现,如下所示:!!有人可以告诉我这个操作员做什么吗?

我看到的背景是

this.vertical = vertical !== undefined ? !!vertical : this.vertical;
樱十三2020/03/09 13:13:23

两次使用非逻辑运算符
意味着!true = false
和!! true = true

A达蒙2020/03/09 13:13:22

JavaScript中的某些运算符执行隐式类型转换,有时用于类型转换。

一元运算!符将其操作数转换为布尔值并取反。

这个事实导致您可以在源代码中看到以下惯用法:

!!x // Same as Boolean(x). Note double exclamation mark
Gil伽罗2020/03/09 13:13:22

看完所有这些很棒的答案后,我想补充说明使用的另一个原因 !!当前,我正在使用Angular 2-4(TypeScript),并且我想false在用户未通过身份验证时返回一个布尔值如果未通过身份验证,则令牌字符串将为null""我可以通过使用下面的代码块来做到这一点:

public isAuthenticated(): boolean {
   return !!this.getToken();
}
路易EvaSam2020/03/09 13:13:22

!!x 是的简写 Boolean(x)

第一次爆炸会迫使js引擎运行,Boolean(x)但也会产生反转值的副作用。因此,第二次爆炸消除了副作用。

Tom老丝Pro2020/03/09 13:13:22

双重布尔取反。通常用于检查值是否未定义。

HarryTom2020/03/09 13:13:22

它不是一个运算符,而是两个。它等效于以下内容,是将值强制转换为布尔值的快速方法。

val.enabled = !(!enable);
达蒙武藏2020/03/09 13:13:22

我怀疑这是C ++的残over剩饭,在这里人们会重写!运算符,但不是布尔运算符。

因此,在这种情况下要获得否定(或肯定)答案,您首先需要使用!运算符以获取布尔值,但是如果要检查肯定的情况,则可以使用!!。

2020/03/09 13:13:22

!!构造是将任何JavaScript表达式转换为其等效布尔值的简单方法。

例如:!!"he shot me down" === true!!0 === false

HarryItachi2020/03/09 13:13:22

是“ boolean not”,实际上将“ enable”的值转换为与其相反的布尔值。第二 !翻转此值。因此,!!enable意味着“不启用”,为您enable提供布尔值。

LEYJim2020/03/09 13:13:22

!!NOT一起使用两次运算,!将值转换为a boolean并将其反转,这是一个简单的示例,了解其!!工作原理:

首先,您拥有的地方:

var zero = 0;

然后!0,将其转换为boolean并被评估为true,因为0为falsy,所以您获得了相反的值并转换为boolean,因此其被评估为true

!zero; //true

但我们不希望值的布尔取反,因此我们可以再次将其取反以获得结果!这就是为什么我们使用另一个!

基本上,请!!确保我们得到的值是布尔值,而不是虚假,真实或字符串等。

因此,就像Boolean在javascript中使用function 一样,但是将值转换为boolean的简便快捷方式:

var zero = 0;
!!zero; //false
JinJin乐2020/03/09 13:13:22

似乎!!运算符导致双重否定。

var foo = "Hello World!";

!foo // Result: false
!!foo // Result: true
凯泡芙JinJin2020/03/09 13:13:22

它模拟了Boolean()强制转换功能的行为NOT无论给定什么操作数,第一个都返回布尔值。第二个取反NOTBoolean值,因此给出true变量布尔值。最终结果与Boolean()在值上使用函数相同

前端Harry十三2020/03/09 13:13:22

这是双重not操作。第一个!将值转换为布尔值,并反转其逻辑值。第二个!将逻辑值反向。

2020/03/09 13:13:22

它只是逻辑非运算符,两次-用于将某些内容转换为布尔值,例如:

true === !!10

false === !!0
蛋蛋猴子2020/03/09 13:13:22

它将后缀转换为布尔值。

Itachi阳光2020/03/09 13:13:22

!!foo将两次unary not运算符应用两次,并用于将其转换为布尔类型,类似于使用unary plus +foo将其转换为数字并连接一个空字符串''+foo以转换为字符串。

除了这些技巧外,您还可以使用与原始类型相对应的构造函数(使用new)来显式转换值,即

Boolean(foo) === !!foo
Number(foo)  === +foo
String(foo)  === ''+foo
2020/03/09 13:13:22

转换Objectboolean如果是falsey(例如0nullundefined等),这将是false,否则,true

!oObject  // inverted boolean
!!oObject // non inverted boolean so true boolean representation

因此!!,不是运算符,只是!运算符的两倍。

实际示例“测试IE版本”:

const isIE8 = !! navigator.userAgent.match(/MSIE 8.0/);  
console.log(isIE8); // returns true or false 

如果你⇒

console.log(navigator.userAgent.match(/MSIE 8.0/));  
// returns either an Array or null  

但是如果你⇒

console.log(!!navigator.userAgent.match(/MSIE 8.0/));  
// returns either true or false
路易番长2020/03/09 13:13:22

!!将其右边的值转换为其等效的布尔值。(想想穷人的“类型转换”方式)。它的意图是通常传达给读者,代码并不关心什么值是可变的,但它的“真”值是。

布雷西2020/03/09 13:13:22

!!expr根据表达式真实性返回布尔值(truefalse在非布尔类型上使用时更有意义。考虑以下示例,尤其是第三个示例及以后的示例:

          !!false === false
           !!true === true

              !!0 === false
!!parseInt("foo") === false // NaN is falsy
              !!1 === true
             !!-1 === true  // -1 is truthy

             !!"" === false // empty string is falsy
          !!"foo" === true  // non-empty string is truthy
        !!"false" === true  // ...even if it contains a falsy value

     !!window.foo === false // undefined is falsy
           !!null === false // null is falsy

             !!{} === true  // an (empty) object is truthy
             !![] === true  // an (empty) array is truthy; PHP programmers beware!