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; } 

而且忍不住想知道为什么双重否定? 有没有其他的方法来达到同样的效果?

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

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

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

然后另一个! 否定它。 一个简洁的转换为布尔值,完全等同于ToBoolean,因为! 被定义为它的否定 。 但是这里没有必要,因为它只是作为条件运算符的条件使用,它将以同样的方式确定真实性。

 var x = "somevalue" var isNotEmpty = !!x.length; 

让我们分解它:

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

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


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

  • 空值
  • 未定义
  • 空string"" (\ ''
  • 数字0
  • 那个号码

所有其他值相当于真实。

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

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

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

但是这并不意味着:

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

如果你需要强制一个“truthy”值为一个真正的布尔值, !! 是一个方便的方法来做到这一点:

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