开发者问题收集

JavaScript 中的 !!(非非)运算符是什么?

2009-04-24
945643

我看到了这段代码:

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

它似乎使用 !! 作为运算符,我不认识它。它起什么作用?

3个回答

它将 Object 转换为 boolean 。如果它为假值(例如 0nullundefined 等),它将为 false ,否则为 true

!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
stevehipwell
2009-04-24

这是进行类型转换的一种非常晦涩难懂的方法。

! 表示 NOT 。因此 !truefalse ,而 !falsetrue!0true ,而 !1false

因此,您要将一个值转换为 布尔值 ,将其取反,然后再次将其取反。

// 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);

注意 :由于 != 运算符的工作方式以及哪些值被视为 ,在某些边缘情况下(例如,当 userId[] 时),中间两个表达式并不 完全 等同于第一个表达式。

Tom Ritter
2009-09-10

!!expr (两个 ! 运算符后跟一个表达式)将表达式的 真值 返回为 truefalse

在非布尔表达式上使用时很有意义。一些示例:

注意: Boolean 函数产生完全相同的结果,并且更具可读性。

!!false // false
           !!true // true

              !!0 // false
!!parseInt("foo") // false — NaN is falsy
              !!1 // true
             !!-1 // true  — negative number 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
Salman Arshad
2012-05-15