在javascript中双重否定(!!) - 目的是什么?

Era*_*dan 116 javascript

可能重复:
什么是!! (不是)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;
}
Run Code Online (Sandbox Code Playgroud)

并不禁想知道为什么双重否定?是否有另一种方法可以达到同样的效果?

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

Ry-*_*Ry- 173

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

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

然后另一个人!再次否定它.一个简洁的强制转换为布尔值,完全等同于ToBoolean,因为它!定义为它的否定.但是,这里没有必要,因为它仅用作条件运算符的条件,它将以相同的方式确定真实性.

  • @gdoron:`1/0 === Infinity`; `1/-0 === -Infinity` (7认同)
  • @JoePC:是的,如果您仅在条件表达式或if语句中使用它,那是正确的说法,这是不需要的步骤。 (3认同)
  • 当您说“几乎相当”时,您知道实际上是否存在任何差异吗?也许比函数调用 Boolean() 更快? (2认同)
  • `if(guess)` 和 `if(!!guess)` 是一样的吗?对于 JS,除了显示目的(显示变量是真还是假)之外,您需要在什么情况下执行此操作?如果您仅在条件表达式或 IF 语句中使用它,这似乎是一个不必要的步骤,因为将始终评估对象的真实性。那是准确的吗? (2认同)
  • @ Ry-谢谢!发布后,我发现了一个很好的案例。从函数返回并需要返回布尔类型而不是对象本身时,例如:`return !! guess;`我可以理解为什么较早使用并不是完全必要的。(`猜测= !! option.guess`) (2认同)

gdo*_*ica 48

var x = "somevalue"
var isNotEmpty = !!x.length;
Run Code Online (Sandbox Code Playgroud)

让我们分解成碎片:

x.length   // 9
!x.length  // false
!!x.length // true
Run Code Online (Sandbox Code Playgroud)

所以它用于将"truethy"\"falsy"值转换为布尔值.


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

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

所有其他值都等于true.


Jam*_*rgy 19

双重否定将"truthy"或"falsy"值转换为布尔值,truefalse.

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

if (options.guess) {
    // runs if options.guess is truthy, 
}
Run Code Online (Sandbox Code Playgroud)

但这并不一定意味着:

options.guess===true   // could be, could be not
Run Code Online (Sandbox Code Playgroud)

如果您需要将"truthy"值强制为true布尔值,那么这!!是一种方便的方法:

!!options.guess===true   // always true if options.guess is truthy
Run Code Online (Sandbox Code Playgroud)