双感叹号?

2022-08-30 01:05:38

可能重复:
是什么!!(不是)JavaScript中的运算符?
在 JavaScript 中, !! 运算符(双感叹号)是什么意思?

所以我正在调试一些代码,并遇到了这个:

var foo.bar = 0; // this is actually passed from another function, adding it for context

function(foo) {
    var someVar = !!foo.bar;

    if (foo.bar) {
      // ..stuff happens
    } else {
      // .. something else happens
    }
}

好吧,我的问题是有什么意义?所有要做的就是使.!!0 === false

  1. 与 相比,使用它有什么好处吗?boolean(foo.bar)

  2. foo.bar 可以在if中评估,因为已经,那么为什么要进行转换呢?(someVar 不会在其他任何地方重复使用)0 === false


答案 1

这会将值转换为布尔值,并确保使用布尔类型

"foo"      // Evaluates to "foo".
!"foo"     // Evaluates to false.
!!"foo"    // Evaluates to true.

如果传递,那么它可能不是0,而是其他一些虚假值。请参阅以下真值表:foo.bar

用于 javascript 的真值表

''        ==   '0'           // false
0         ==   ''            // true
0         ==   '0'           // true
false     ==   'false'       // false
false     ==   '0'           // true
false     ==   undefined     // false
false     ==   null          // false
null      ==   undefined     // true
" \t\r\n" ==   0             // true

来源:道格·克罗克福德

当涉及到NaN值时,Javascript也变得非常奇怪。这是我唯一能想到的案例!会表现得与 ===不同。

NaN   ===  NaN     //false
!!NaN === !!NaN    //true

// !!NaN is false

答案 2

我认为答案是没有多大意义。我们可以推测它是如何产生的:

  • 也许是在多个地方使用的函数的早期版本,或者以真正受益于或的方式,所以这更有意义。someVartruefalse
  • 也许编写该函数的人已经习惯于使用转换为/以至于他甚至没有注意到这里没有必要。!!truefalse
  • 也许编写函数的人认为,每个计算(在本例中为布尔转换)都应该通过为其结果分配一些变量来赋予一个有意义的名称。
  • 也许,因为JavaScript中的布尔转换令人惊讶地容易出错(例如 是一个真值值),编写函数的人认为它应该总是显式地而不是隐式地完成 - 即使效果是相同的 - 只是为了引起人们对它作为潜在错误点的注意。new Boolean(false)
    • 当然,这是假设编写函数的人认为是“显式”布尔转换。从技术上讲,它不是 - 它使用相同的隐式布尔转换 - 但如果你习惯了这个成语,那么它相当于一个显式转换。!!if

但在我的主观意见中,这些理由都不是很好!