我看到一些代码似乎使用了我不认识的运算符,以两个感叹号的形式,像这样:!!。有人能告诉我这个接线员做什么吗?
我看到这件事的背景是,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
我看到一些代码似乎使用了我不认识的运算符,以两个感叹号的形式,像这样:!!。有人能告诉我这个接线员做什么吗?
我看到这件事的背景是,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
当前回答
我怀疑这是C++遗留下来的东西,在那里人们会重写!运算符,但不是布尔运算符。
因此,在这种情况下,要获得否定(或肯定)答案,首先需要使用!运算符来获取布尔值,但如果您想检查正数,则可以使用!!。
其他回答
它将Object转换为布尔值。如果为假(例如,0、null、undefined等),则为假,否则为真。
!object // Inverted Boolean
!!object // Noninverted Boolean, so true Boolean representation
所以不是操作员;这只是!操作员两次。
这样做可能更简单:
Boolean(object) // Boolean
真实世界示例“测试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
我认为值得一提的是,与逻辑“与/或”组合的条件不会返回布尔值,而是在&&的情况下返回最后一次成功或第一次失败,在条件链的||的情况下,返回第一次成功或最后一次失败。
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
!! 不是运算符。这只是!操作员两次。
但使用JavaScript,应用!!在大多数情况下,将Object转换为Boolean是冗余和冗长的,因为:
值未定义或为空的任何对象,包括值为false的布尔对象,传递给有条件的陈述
示例:if({}){console.log(“{}是true”)}//logs:“{}是true”
! 是“Boolean not”,这实际上是将“enable”的值类型化为其布尔值的相反值。第二个!翻转此值。所以enable表示“不启用”,将enable值作为布尔值。
有时,有必要检查函数中是否有值,数量本身对我们来说并不重要,但它是否重要。
例如,我们想检查用户是否有专业,并且我们有一个如下的功能:
hasMajor() {return this.major} // It returns "(users major is) Science"
但答案对我们来说并不重要。我们只想检查它是否有主,我们需要一个布尔值(true或false)。我们如何得到它?
就像这样:
hasMajor() { return !(!this.major)}
或相同
hasMajor() {return !!this.major)}
如果this.major有值,那么!this.major返回false,但因为值有出口,我们需要返回true,所以我们使用!两次返回正确答案!(!this.major)。