我看到一些代码似乎使用了我不认识的运算符,以两个感叹号的形式,像这样:!!。有人能告诉我这个接线员做什么吗?

我看到这件事的背景是,

this.vertical = vertical !== undefined ? !!vertical : this.vertical;

当前回答

它模拟Boolean()转换函数的行为。无论给定什么操作数,第一个NOT都返回布尔值。第二个NOT否定该布尔值,从而给出变量的真正布尔值。最终结果与对值使用Boolean()函数相同。

其他回答

!! 不是运算符。这只是!操作员两次。

但使用JavaScript,应用!!在大多数情况下,将Object转换为Boolean是冗余和冗长的,因为:

值未定义或为空的任何对象,包括值为false的布尔对象,传递给有条件的陈述

示例:if({}){console.log(“{}是true”)}//logs:“{}是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!

只是为了检查是否存在

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

它不是一个操作员;它是两个。它相当于以下内容,是将值转换为布尔值的快速方法。

val.enabled = !(!enable);

沏茶:

!! 不是运算符。这是双重用途!--这是逻辑“not”运算符。


理论上:

! 确定值不是什么的“真相”:

事实是假的不是真的(这就是为什么!假的结果真实)事实是真的不是假的(这就是为什么!真的结果假)


!! 确定值不是什么的“真相”:

事实是真的不是假的(这就是为什么!!真的结果是真的)事实是,假的不是假的(这就是为什么!!假的结果是假的)


我们希望在比较中确定的是参考值的“真相”,而不是参考本身的值。在一个用例中,我们可能想知道值的真实性,即使我们希望值为false(或false),或者如果我们希望值不是布尔类型。


在实践中:

考虑一个简洁的函数,它通过动态类型(也称为“鸭子类型”)来检测特性功能(在本例中,还包括平台兼容性)。如果用户的浏览器支持HTML5<audio>元素,我们希望编写一个返回true的函数,但如果<audio<未定义,我们不希望该函数抛出错误;我们不想使用try。。。捕捉以处理任何可能的错误(因为它们很严重);此外,我们也不希望在函数中使用无法始终揭示功能真相的检查(例如,document.createElement('audio')仍将创建一个名为<audio>的元素,即使不支持HTML5<audio')。


以下是三种方法:

// this won't tell us anything about HTML5 `<audio>` as a feature
var foo = function(tag, atr) { return document.createElement(tag)[atr]; }

// this won't return true if the feature is detected (although it works just fine)
var bar = function(tag, atr) { return !document.createElement(tag)[atr]; }

// this is the concise, feature-detecting solution we want
var baz = function(tag, atr) { return !!document.createElement(tag)[atr]; }

foo('audio', 'preload'); // returns "auto"
bar('audio', 'preload'); // returns false
baz('audio', 'preload'); // returns true

每个函数都接受一个<tag>参数和一个要查找的属性,但它们都会根据比较结果返回不同的值。

但等等,还有更多!

你们中的一些人可能注意到,在这个特定的示例中,可以使用稍微更高性能的方法来检查对象是否具有属性。有两种方法可以做到这一点:

// the native `hasOwnProperty` method
var qux = function(tag, atr) { return document.createElement(tag).hasOwnProperty(atr); }

// the `in` operator
var quux = function(tag, atr) { return atr in document.createElement(tag); }

qux('audio', 'preload');  // returns true
quux('audio', 'preload'); // returns true

我们离题了。。。

无论这些情况多么罕见,可能存在一些情况,其中最简洁、最高效,因此最优选的从非布尔值(可能是未定义的值)获得真值的方法确实是使用!!。希望这可笑地澄清了这一点。