这个表达是什么意思“!!”

时间:2010-06-17 07:06:16

标签: javascript

为什么有人会使用像

这样的表达式
if(!!window.JSON) alert('exists');

而不仅仅是

if(window.JSON) alert('exists');

“!!”还有另一种用法吗?东西?

5 个答案:

答案 0 :(得分:15)

!!只会导致布尔转换,根本不需要将此构造与if语句一起使用,也可以在第一个代码段中转换对象对布尔没有意义,它将始终为真

falsenullundefinedNaN和空字符串以及0可以强制转换为false的唯一值其他任何东西都会强迫true

当你想要确保获得布尔结果时,使用!!是有意义的,例如在使用逻辑&&||运算符时。

这些运算符可以返回操作数的值,而不是布尔结果,例如:

true && "foo"; // "foo"
"foo" || "bar" ; // "foo"

想象一下,你有一个测试两个值的函数,你期望得到一个布尔结果:

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

isFoo(); // returns 0, here it makes sense to use !!

修改:查看您的修改,if (!!window.JSON)就像我之前所说的那样多余,因为if statement本身将进行布尔转换internally评估条件表达式。

答案 1 :(得分:2)

他们可能正在尝试将对象强制转换为布尔值。通过对对象应用一个布尔运算符(!),它变成了一个bool,但它们实际上并不想要否定,所以它们应用第二个来取消第一个。

答案 2 :(得分:2)

// !! = boolean typecasting in javascript

var one = 1
var two = 2;

if (one==true) app.alert("one==true");
if (!!one==true) app.alert("!!one==true");

if (two==true) app.alert("two==true"); // won't produce any output
if (!!two==true) app.alert("!!two==true");

答案 3 :(得分:1)

!是一个逻辑否定,!!是两次应用的逻辑否定,即逻辑身份

我认为你正在阅读的代码只是无害(虽然令人困惑)多余。

答案 4 :(得分:1)

它是一个布尔转换,确保第一次转换为布尔值,然后否定回原始值。

但是在这里使用不正确,只有在将其分配给另一个变量时才会真正有用 - 出于性能原因

var isJSON = (!!window.JSON);

if (isJSON) doX;
if (isJSON) doY;
if (isJSON) doZ;