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

Kei*_*rup 31 javascript boolean operators

我理解double not运算符在JavaScript中的作用.我很好奇它的使用,以及我最近做出的断言是否正确.

我说这if (!!someVar)从来没有意义,也不是(!!someVar && ...因为它if&&将导致someVar被评估为布尔值所以!! 是多余的.

事实上,我唯一能想到使用double not运算符是合法的,如果你想对另一个布尔值进行严格的比较(那么可能在返回值中明确要求true或false).

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

双重在这些情况下没有任何实际效果吗?

我个人认为,这只是导致混乱.如果我看到if语句,我知道它将它作为布尔值进行评估.

CMS*_*CMS 41

在我和你在一起的if语句中,它是完全安全的,因为在内部,ToBoolean操作将在条件表达式上执行(参见规范中的步骤3).

但是,如果你想,从函数返回一个布尔值,你应该确保结果实际上是布尔值,例如:

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

console.log(isFoo()); // will show zero
typeof isFoo() == "number";
Run Code Online (Sandbox Code Playgroud)

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

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

true && "foo"; // "foo"
Run Code Online (Sandbox Code Playgroud)

并且它将返回第一个操作数的值,如果它本身是假的:

NaN && "anything"; // NaN
0 && "anything"; // 0
Run Code Online (Sandbox Code Playgroud)

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

false || "bar"; // "bar"
Run Code Online (Sandbox Code Playgroud)

并且它将返回第一个操作数的值,如果它本身是非虚假的:

"foo" || "anything"; // "foo"
Run Code Online (Sandbox Code Playgroud)

也许这是值得一提的是,falsy值是:null,undefined,NaN,0,零长度字符串,当然false.

布尔上下文中计算的任何其他(不是假的,Boolean对象或Boolean值)将返回.true