我看到了一些代码,它们似乎使用了我不认识的运算符,它们以两个感叹号的形式出现,如下所示:!!
。有人可以告诉我这个操作员做什么吗?
我看到的背景是
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
我看到了一些代码,它们似乎使用了我不认识的运算符,它们以两个感叹号的形式出现,如下所示:!!
。有人可以告诉我这个操作员做什么吗?
我看到的背景是
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
JavaScript中的某些运算符执行隐式类型转换,有时用于类型转换。
一元运算!
符将其操作数转换为布尔值并取反。
这个事实导致您可以在源代码中看到以下惯用法:
!!x // Same as Boolean(x). Note double exclamation mark
看完所有这些很棒的答案后,我想补充说明使用的另一个原因 !!
。当前,我正在使用Angular 2-4(TypeScript),并且我想false
在用户未通过身份验证时返回一个布尔值。如果未通过身份验证,则令牌字符串将为null
或""
。我可以通过使用下面的代码块来做到这一点:
public isAuthenticated(): boolean {
return !!this.getToken();
}
!!x
是的简写 Boolean(x)
第一次爆炸会迫使js引擎运行,Boolean(x)
但也会产生反转值的副作用。因此,第二次爆炸消除了副作用。
双重布尔取反。通常用于检查值是否未定义。
它不是一个运算符,而是两个。它等效于以下内容,是将值强制转换为布尔值的快速方法。
val.enabled = !(!enable);
我怀疑这是C ++的残over剩饭,在这里人们会重写!运算符,但不是布尔运算符。
因此,在这种情况下要获得否定(或肯定)答案,您首先需要使用!运算符以获取布尔值,但是如果要检查肯定的情况,则可以使用!!。
该!!
构造是将任何JavaScript表达式转换为其等效布尔值的简单方法。
例如:!!"he shot me down" === true
和!!0 === false
。
!是“ boolean not”,实际上将“ enable”的值转换为与其相反的布尔值。第二 !翻转此值。因此,!!enable
意味着“不启用”,为您enable
提供布尔值。
!!
它NOT
一起使用两次运算,!
将值转换为a boolean
并将其反转,这是一个简单的示例,了解其!!
工作原理:
首先,您拥有的地方:
var zero = 0;
然后!0
,将其转换为boolean并被评估为true
,因为0为falsy
,所以您获得了相反的值并转换为boolean,因此其被评估为true
。
!zero; //true
但我们不希望值的布尔值取反,因此我们可以再次将其取反以获得结果!这就是为什么我们使用另一个!
。
基本上,请!!
确保我们得到的值是布尔值,而不是虚假,真实或字符串等。
因此,就像Boolean
在javascript中使用function 一样,但是将值转换为boolean的简便快捷方式:
var zero = 0;
!!zero; //false
似乎!!
运算符导致双重否定。
var foo = "Hello World!";
!foo // Result: false
!!foo // Result: true
它模拟了Boolean()
强制转换功能的行为。NOT
无论给定什么操作数,第一个都返回布尔值。第二个取反NOT
该Boolean
值,因此给出true
变量的布尔值。最终结果与Boolean()
在值上使用函数相同。
这是双重not
操作。第一个!
将值转换为布尔值,并反转其逻辑值。第二个!
将逻辑值反向。
它只是逻辑非运算符,两次-用于将某些内容转换为布尔值,例如:
true === !!10
false === !!0
它将后缀转换为布尔值。
!!foo
将两次unary not运算符应用两次,并用于将其转换为布尔类型,类似于使用unary plus +foo
将其转换为数字并连接一个空字符串''+foo
以转换为字符串。
除了这些技巧外,您还可以使用与原始类型相对应的构造函数(不使用new
)来显式转换值,即
Boolean(foo) === !!foo
Number(foo) === +foo
String(foo) === ''+foo
转换Object
为boolean
。如果是falsey(例如0
,null
,undefined
等),这将是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
!!
将其右边的值转换为其等效的布尔值。(想想穷人的“类型转换”方式)。它的意图是通常传达给读者,代码并不关心什么值是可变的,但它的“真”值是。
!!expr
根据表达式的真实性返回布尔值(true
或false
)。在非布尔类型上使用时更有意义。考虑以下示例,尤其是第三个示例及以后的示例:
!!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!
两次使用非逻辑运算符
意味着!true = false
和!! true = true