一尘不染

何时在JavaScript中使用double not(!!)运算符

javascript

我了解doublenot运算符在JavaScript中的作用。我很好奇它的用法,以及我最近的断言是否正确,我对此很好奇。

我说这if (!!someVar)既没有意义,也不是(!!someVar && ...因为if&&都将someVar评估为布尔值,所以!!
是多余的。

实际上,我唯一想到使用double not运算符是合法的,是如果您想与另一个布尔值进行严格比较(因此可能返回的值显式地期望为true或false)。

它是否正确?当我注意到jQuery 1.3.2同时使用if (!!someVar)和时,我开始怀疑自己。return !!someVar && ...

在这种情况下,double是否没有任何实际作用?

我个人认为这只会导致混乱。如果看到if语句,则知道它正在将其评估为布尔值。


阅读 328

收藏
2020-05-01

共1个答案

一尘不染

在我与您在一起的if陈述的上下文中,这是完全安全的,因为在内部,该ToBoolean操作将在条件表达式上执行(
请参阅规范的第3步 )。

但是,如果要从函数返回布尔值,则应确保结果实际上是布尔值,例如:

function isFoo () {
  return 0 && true;
}

console.log(isFoo()); // will show zero
typeof isFoo() == "number";

总之,布尔逻辑运算符可以返回操作数 ,而不一定返回Boolean结果:

如果第一个 操作数真实的&&,则逻辑AND运算符()将返回 第二个操作数 的值: __

true && "foo"; // "foo"

如果它本身是 falsy ,它将返回 第一个操作数 的值: __

NaN && "anything"; // NaN
0 && "anything"; // 0

另一方面,如果第一个 操作数falsy ,则逻辑OR运算符(||)将返回 第二个操作数 的值: __

false || "bar"; // "bar"

如果它本身不是伪造的,它将返回 第一个操作数 的值:

"foo" || "anything"; // "foo"

也许这是值得一提的是, falsy 值是:nullundefinedNaN0,零长度字符串,当然false

布尔上下文中 评估的任何其他内容(不是 虚假的Boolean对象或Boolean值)都将返回。 __true

2020-05-01