我看到一些代码似乎使用了我不认识的运算符,以两个感叹号的形式,像这样:!!。有人能告诉我这个接线员做什么吗?
我看到这件事的背景是,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
我看到一些代码似乎使用了我不认识的运算符,以两个感叹号的形式,像这样:!!。有人能告诉我这个接线员做什么吗?
我看到这件事的背景是,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
当前回答
这个问题已经得到了非常彻底的回答,但我想补充一个答案,我希望这个答案尽可能简化,使!!尽可能简单地掌握。
因为JavaScript具有所谓的“truthy”和“falsy”值,所以有些表达式在其他表达式中求值时会导致true或false条件,即使所检查的值或表达式实际上不是true或false。
例如:
if (document.getElementById('myElement')) {
// Code block
}
如果该元素确实存在,则表达式将求值为true,并执行代码块。
然而:
if (document.getElementById('myElement') == true) {
// Code block
}
…将不会导致真条件,并且代码块将不会被执行,即使元素确实存在。
为什么?因为document.getElementById()是一个“truthy”表达式,它在这个if()语句中的值为true,但它不是一个真正的布尔值true。
在这种情况下,双“not”相当简单。这只是背靠背的两个不。
第一个简单地“反转”真值或假值,产生实际的布尔类型,然后第二个简单地将其“反转”回原始状态,但现在是实际的布尔值。这样你就有了一致性:
if (!!document.getElementById('myElement')) {}
and
if (!!document.getElementById('myElement') == true) {}
将如预期的那样返回true。
其他回答
我怀疑这是C++遗留下来的东西,在那里人们会重写!运算符,但不是布尔运算符。
因此,在这种情况下,要获得否定(或肯定)答案,首先需要使用!运算符来获取布尔值,但如果您想检查正数,则可以使用!!。
我认为值得一提的是,与逻辑“与/或”组合的条件不会返回布尔值,而是在&&的情况下返回最后一次成功或第一次失败,在条件链的||的情况下,返回第一次成功或最后一次失败。
res = (1 && 2); // res is 2
res = (true && alert) // res is function alert()
res = ('foo' || alert) // res is 'foo'
为了将条件转换为真正的布尔文字,我们可以使用双重否定:
res = !!(1 && 2); // res is true
res = !!(true && alert) // res is true
res = !!('foo' || alert) // res is true
看来是!!运算符导致双重否定。
var foo = "Hello, World!";
!foo // Result: false
!!foo // Result: true
只是为了检查是否存在
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
!!expr(后跟表达式的两个!运算符)根据表达式的真实性返回布尔值(true或false)。当用于非布尔类型时,它更有意义。考虑以下示例,尤其是第三个示例及其后续示例:
!!false === false
!!true === true
!!0 === false
!!parseInt("foo") === false // NaN is falsy
!!1 === true
!!-1 === true // -1 is truthy
!!(1/0) === true // Infinity 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 value is falsy
!!undefined === false // undefined primitive is falsy
!!null === false // null is falsy
!!{} === true // an (empty) object is truthy
!![] === true // an (empty) array is truthy; PHP programmers beware!