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

IT技术 javascript operators boolean
2021-01-13 15:44:21

我了解双不运算符在 JavaScript 中的作用我很好奇它的用途以及我最近所做的断言是否正确。

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

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

这个对吗?当我注意到 jQuery 1.3.2 同时使用if (!!someVar)return !!someVar && ...

在这些情况下,double 没有任何实际影响吗?

我个人的观点是,它只会导致混乱。如果我看到一个 if 语句,我知道它正在将它评估为一个布尔值。

2个回答

我与您同在的if语句上下文中,它是完全安全的,因为在内部,ToBoolean操作将在条件表达式上执行(请参阅规范中的步骤 3)。

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

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

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

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

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

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

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

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

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

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

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

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

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

布尔上下文中评估的任何其他内容(不是falsyBoolean对象或Boolean值)将返回.true

如果您处于需要!!expr某事的情况下,请考虑Boolean(expr)为了可读性而编写它,因为它在功能上是等效的。
2021-03-23 15:44:21
这是我经常遇到的一个用例:JSX 中的短路渲染。如果您尝试渲染零长度数组的元素,则最终可能会渲染“0”。我做了一个codepen来演示:codepen.io/lucask42/full/GGbqdv
2021-03-30 15:44:21
另一种说法:逻辑 AND 运算符返回遇到的第一个“假”操作数,而逻辑 OR 运算符返回第一个“真”操作数。此外,为了完整起见,-0 也被认为是“假的”。
2021-04-03 15:44:21

是的,当您想要 0||1 返回值时使用 !!var。

一种是布尔值的简单比较,当您希望“a == b”等价于“a xor not b”时,除了 a=5 和 b=7 都为真但不相等。

另一种情况是当您想将一组条件强制转换为变量的位时:

 var BIT_NONEMPTY=1;
 var BIT_HASERRORS=2;
 var BIT_HASCHILDREN=4;
 var BIT_HASCONTENT=8;

 result_bitfields = 
    (!!countLines())*BIT_NOTEMPTY +
    (!!errorCode())*BIT_HASERRORS +
    (!!firstChild())*BIT_HASCHILDREN +
    (!!getContent())*BIT_HASCONTENT;

在离位值很远的 Javascript 中不是很有用,但有时可能很有用。

不: !!转换为 false 或 true,而不是 0 或 1。(在您的位域示例中,然后由 * 运算符将 true 强制为 1,并将 false 强制为 0)。
2021-03-29 15:44:21