为什么有人会使用像
这样的表达式if(!!window.JSON) alert('exists');
而不仅仅是
if(window.JSON) alert('exists');
“!!”还有另一种用法吗?东西?
答案 0 :(得分:15)
!!
只会导致布尔转换,根本不需要将此构造与if
语句一起使用,也可以在第一个代码段中转换对象对布尔没有意义,它将始终为真。
false
,null
,undefined
,NaN
和空字符串以及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;