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

我明白JavaScript中的double not操作符的作用 。 我很好奇这是否有用,以及我最近提出的主张是否正确。

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

实际上,我唯一能想到使用double not运算符是合理的是,如果你想对另一个布尔值做一个严格的比较(所以也许在返回的值显式为true或false)。

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

在这种情况下双打没有任何实际效果?

我个人的看法是,这只会导致混乱。 如果我看到一个if语句,我知道它是评估它作为一个布尔值。

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

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

 function isFoo () { return 0 && true; } console.log(isFoo()); // will show zero typeof isFoo() == "number"; 

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

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

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

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

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

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

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

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

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

也许值得一提的是, falsy的值是: nullundefinedNaN0 ,零长度的string,当然也是false

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

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

一个是bool值的简单比较,当你想要“a == b”等价于“a xor not b”,除了a = 5和b = 7都是真的,但不相等。

另一种情况是,当你想把一组条件强加到一个variables的位时:

  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中不是非常有用,但有时候可能会有用。