这个表达意味着什么“!!”
为什么有人使用表达式像这个表达意味着什么“!!”
if(!!window.JSON) alert('exists');
,而不是仅仅
if(window.JSON) alert('exists');
?
“!!”还有其他用法吗?东西?
!是一种逻辑否定,!!是逻辑否定应用两次,即逻辑身份
我会假设你正在阅读的代码只是无害(虽然令人费解)冗余。
是的,但是这个问题不涉及从对象到布尔型的隐式类型转换吗? – 2010-06-17 07:11:25
!!
只会导致一个布尔值转换,没有必要在所有使用此与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。
他们可能试图将对象转换为布尔值。通过对对象应用布尔运算符(!
),它会变成布尔值,但它们实际上并不需要否定,因此它们会应用第二个取消第一个。
// !! = 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");
这就是为什么你应该使用'==='并明确地投射:'= ='类型转换规则是WTF的一些东西 – Christoph 2010-06-17 07:37:22
它是一个布尔转换,确保首次转换为布尔值,然后否定回原始值。
然而,使用不当这里只会真的是相关的,如果你把它分配给另一个变量 - 由于性能原因
var isJSON = (!!window.JSON);
if (isJSON) doX;
if (isJSON) doY;
if (isJSON) doZ;
多底片是虽然明白了,这就是原因。如果你继续在你的代码中使用if(!!(!!)!!!(!)!! obj),那么只有你可以维护它(如果你幸运的话) - 我不是不虚的! – simendsjo 2010-06-17 07:10:20
请参阅http:// *。/ 1406604/what-does-operator-double-exclamation-point-mean-in-javascript/1407769#1407769;你是对的,在这种情况下,它是多余的,因为'if()'已经转换为布尔型 – Christoph 2010-06-17 07:19:26