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 )
 它转换为布尔值。 第一! 否定一次,转换价值如下: 
-   undefined为true
-   null为true
-   +0为true
-   -0为true
-   ''为true
-   NaN为true
-   false成true
-  所有其他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”值转换为布尔值, true或false 。 
大多数人都熟悉使用真实性作为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