【问题标题】:Double negation (!!) in javascript - what is the purpose? [duplicate]javascript中的双重否定(!!) - 目的是什么? [复制]
【发布时间】:2012-05-15 02:22:10
【问题描述】:

可能重复:
What is the !! (not not) operator in JavaScript?

我遇到过这段代码

function printStackTrace(options) {
    options = options || {guess: true};
    var ex = options.e || null, guess = !!options.guess;
    var p = new printStackTrace.implementation(), result = p.run(ex);
    return (guess) ? p.guessAnonymousFunctions(result) : result;
}

不禁想知道为什么要双重否定?有没有其他方法可以达到同样的效果?

(代码来自https://github.com/eriwen/javascript-stacktrace/blob/master/stacktrace.js

【问题讨论】:

    标签: javascript


    【解决方案1】:

    它转换为布尔值。第一个! 否定它一次,转换值如下:

    • undefinedtrue
    • nulltrue
    • +0true
    • -0true
    • ''true
    • NaNtrue
    • falsetrue
    • false 的所有其他表达式

    然后另一个! 再次否定它。一个简洁的布尔转换,完全等同于ToBoolean,因为!defined as its negation。不过这里没有必要,因为它只是用作条件运算符的条件,它会以同样的方式确定真实性。

    【讨论】:

    • 当你说“差不多”时,你知道是否真的有任何区别吗?也许比函数调用 Boolean() 快?
    • @gdoron: 1 / 0 === Infinity; 1 / -0 === -Infinity
    • if(guess)if(!!guess) 一样吗?对于 JS,除了显示目的(显示变量是真还是假)之外,您还需要在什么情况下执行此操作?如果您仅在条件表达式或 IF 语句中使用它,这似乎是一个不需要的步骤,因为将始终评估对象的真实性。准确吗?
    • @JoePC:是的,你说得对,如果你只在条件表达式或 if 语句中使用它,那么这是一个不需要的步骤
    • @Ry- 谢谢!在我发布之后,我遇到了一个很好的案例。当从函数返回并需要返回布尔类型而不是对象本身时,例如:return !!guess; 我可以看到为什么早期的用法不是完全必要的。 (guess = !!option.guess)
    【解决方案2】:
    var x = "somevalue"
    var isNotEmpty = !!x.length;
    

    让我们把它分解成碎片:

    x.length   // 9
    !x.length  // false
    !!x.length // true
    

    所以它被用来将“truethy”\“falsy”值转换为布尔值。


    以下值相当于条件语句中的false:

    • 未定义
    • 空字符串""(\'')
    • 数字0
    • 数字NaN

    所有其他值都等同于 true。

    【讨论】:

      【解决方案3】:

      双重否定将“真”或“假”值转换为布尔值truefalse

      大多数人都熟悉使用真实性作为测试:

      if (options.guess) {
          // runs if options.guess is truthy, 
      }
      

      但这并不一定意味着:

      options.guess===true   // could be, could be not
      

      如果您需要将“真实”值强制为真正的布尔值,!! 是一种方便的方法:

      !!options.guess===true   // always true if options.guess is truthy
      

      【讨论】:

      • 这个答案说得很清楚。我对真值和布尔值有同样的疑问
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 2011-08-23
      • 1970-01-01
      • 2016-12-23
      相关资源
      最近更新 更多