我看到一些代码似乎使用了一个我不认识的运算符,以两个感叹号的形式出现,如下所示: !!
。有人可以告诉我这个运营商做了什么?
我看到这个的背景是,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
将 oObject oObject
为布尔值。如果它是假的(例如 0, null
, undefined
等),则为false
,否则为true
。
!oObject //Inverted boolean
!!oObject //Non inverted boolean so true boolean representation
所以!!
不是运营商,只是!
操作员两次。
真实世界示例 “测试 IE 版本”:
let isIE8 = false;
isIE8 = !! navigator.userAgent.match(/MSIE 8.0/);
console.log(isIE8); // returns true or false
如果你⇒
console.log(navigator.userAgent.match(/MSIE 8.0/));
// returns null
但如果你⇒
console.log(!!navigator.userAgent.match(/MSIE 8.0/));
// returns true or false
这是进行类型转换的一种非常模糊的方式。
!
不是 。所以!true
是false
,而且!false
是true
。 !0
为true
, !1
为false
。
所以你要将一个值转换为布尔值,然后将其反转,然后再将其反转。
// Maximum Obscurity:
val.enabled = !!userId;
// Partial Obscurity:
val.enabled = (userId != 0) ? true : false;
// And finally, much easier to understand:
val.enabled = (userId != 0);
!!expr
根据表达式的真实性返回一个布尔值( true
或false
)。在非布尔类型上使用时更有意义。考虑这些示例,尤其是第 3 个示例及以后的示例:
!!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!