在javascript中!!目的是什么?

Double negation (!!) in javascript - what is the purpose?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is the !! (not not) operator in JavaScript?

我遇到过这段代码

1
2
3
4
5
6
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
  • 所有其他对false的表达

然后另一个!又否定了它。一种简洁的布尔转换,完全等同于to boolean,因为!被定义为它的否定。不过,这里不需要,因为它只用作条件运算符的条件,条件运算符将以相同的方式确定真实性。


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

让我们把它拆开:

1
2
3
x.length   // 9
!x.length  // false
!!x.length // true

所以它将"truethy""falsy"值转换为布尔值。

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

  • 无效的
  • 未定义
  • 空字符串""('')
  • 数字0
  • 数字南

所有其他值都等于真。


双重否定将"真"或"假"值转换为布尔值,即truefalse

大多数人都熟悉使用Truthiness作为测试:

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

但这并不一定意味着:

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

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

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