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

时间:2012-05-06 01:50:34

标签: javascript

  

可能重复:
  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

3 个答案:

答案 0 :(得分:160)

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

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

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

答案 1 :(得分:45)

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

让我们把它分解成碎片:

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

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


以下值在条件语句

中等效于false
  • 未定义
  • 空字符串""(\ ''
  • 数字0
  • 数字NaN

所有其他值均等于true。

答案 2 :(得分:18)

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

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

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