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

2022-08-30 02:06:43

可能的副本:
什么是!!(不是)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。)


答案 1

它转换为布尔值。第一个否定它一次,像这样转换值:!

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

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


答案 2
var x = "somevalue"
var isNotEmpty = !!x.length;

让我们把它分成几部分:

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

因此,它用于将“truethy”“falsy”值转换为布尔值。


以下值等效于条件语句中的 false:

  • 定义
  • 空字符串"" (\ '')
  • 数字 0
  • 数字 NaN

所有其他值都等效于 true。