我看到一些代码似乎使用了我不认识的运算符,以两个感叹号的形式,像这样:!!。有人能告诉我这个接线员做什么吗?
我看到这件事的背景是,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
我看到一些代码似乎使用了我不认识的运算符,以两个感叹号的形式,像这样:!!。有人能告诉我这个接线员做什么吗?
我看到这件事的背景是,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
当前回答
我怀疑这是C++遗留下来的东西,在那里人们会重写!运算符,但不是布尔运算符。
因此,在这种情况下,要获得否定(或肯定)答案,首先需要使用!运算符来获取布尔值,但如果您想检查正数,则可以使用!!。
其他回答
这是一种非常晦涩的类型转换方法。
! 表示不。所以真是假的,而且!假是真!0为真,并且!1为假。
所以你要将一个值转换成布尔值,将其反转,然后再次反转。
// Maximum Obscurity:
val.enabled = !!userId;
// Partial Obscurity:
val.enabled = (userId != 0) ? true : false;
// And finally, much easier to understand:
val.enabled = (userId != 0);
// Or just
val.enabled = Boolean(userId);
注意:由于!=运算符的作用以及哪些值被认为是正确的。
这是一次双重手术。第一个!将值转换为布尔值并反转其逻辑值。第二个!反转逻辑值。
!!x是布尔(x)的简写。
第一次爆炸迫使JavaScript引擎运行Boolean(x),但它也有反转值的副作用。所以第二次爆炸消除了副作用。
!!foo两次应用一元not运算符,并用于转换为布尔类型,类似于使用一元加号+foo转换为数字,并连接空字符串“”+foo以转换为字符串。
除了这些黑客,您还可以使用与基元类型相对应的构造函数(不使用new)来显式转换值,即。,
Boolean(foo) === !!foo
Number(foo) === +foo
String(foo) === ''+foo
只是为了检查是否存在
if(!!isComplianceOnHold){
//write code here is not undefined
//if isComplianceOnHold is undefined or null will not enter in net is false
// if isComplianceOnHold is not null or even boolean net result is true and enter inside if block
}
任何值未定义或为null的对象,包括值为false的布尔对象,在传递给条件语句时其计算结果为true