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