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

时间:2010-02-01 02:14:17

标签: javascript operators boolean

我理解what the double not operator does in JavaScript。我很好奇它的使用,以及我最近做出的断言是否正确。

我说if (!!someVar)永远不会有意义,也不是(!!someVar && ...,因为if&&都会导致someVar被评估为布尔值,所以!!是多余的。

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

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

时,我开始怀疑自己

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

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

2 个答案:

答案 0 :(得分:39)

if statements我和你在一起的情况下,它是完全安全的,因为在内部,ToBoolean操作将在条件表达式上执行(参见规范中的步骤3 < / em>的)。

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

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

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

总之,Boolean Logical Operators 可以返回操作数,而不是Boolean结果:

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

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

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

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

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

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

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

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

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

boolean context中评估的任何其他内容(不是 falsy Boolean对象或Boolean值)将返回true

答案 1 :(得分:0)

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

一个是bool值的简单比较,当你想要“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中非常有用,Javascript与位值相差很远,但有时可能很有用。