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

When to use the double not (!!) operator in JavaScript

我理解double not操作符在javascript中的作用。我很好奇它的用途,以及我最近的一个断言是否正确。

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

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

这是正确的吗?当我注意到jquery 1.3.2同时使用if (!!someVar)return !!someVar && ...时,我开始怀疑自己。

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

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


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

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

1
2
3
4
5
6
function isFoo () {
  return 0 && true;
}

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

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

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

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

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

1
2
NaN &&"anything"; // NaN
0 &&"anything"; // 0

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

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

如果第一个操作数本身没有错误,它将返回第一个操作数的值:

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

也许值得一提的是,错误的值是:nullundefinedNaN0、零长度字符串,当然还有false

在布尔上下文中评估的任何其他(不是falsy、Boolean对象或Boolean值)都将返回true


是的!!var用于需要0_1返回值的情况。

一个是对bool值的简单比较,当您希望"a==b"等于"a xor not b"时,除了a=5和b=7都是真的,但不等于。

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

1
2
3
4
5
6
7
8
9
10
 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中不是很有用,它离位值非常远,但有时可能有用。