2010-06-17 245 views
5

为什么有人使用表达式像这个表达意味着什么“!!”

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

,而不是仅仅

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

“!!”还有其他用法吗?东西?

+0

多底片是虽然明白了,这就是原因。如果你继续在你的代码中使用if(!!(!!)!!!(!)!! obj),那么只有你可以维护它(如果你幸运的话) - 我不是不虚的! – simendsjo 2010-06-17 07:10:20

+1

请参阅http:// stackoverflow。/ 1406604/what-does-operator-double-exclamation-point-mean-in-javascript/1407769#1407769;你是对的,在这种情况下,它是多余的,因为'if()'已经转换为布尔型 – Christoph 2010-06-17 07:19:26

回答

1

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

我会假设你正在阅读的代码只是无害(虽然令人费解)冗余。

+0

是的,但是这个问题不涉及从对象到布尔型的隐式类型转换吗? – 2010-06-17 07:11:25

15

!!只会导致一个布尔值转换,没有必要在所有使用此与if语句结构,也是在你的第一个片段,转换对象布尔是没有意义的,这将是总是如此

,可以强制对false值只有nullundefinedNaN0和空字符串,当然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

+0

看起来像你的意思写'function isFoo(obj){return obj&& true;} isFoo(0);'在最后一个例子:)或'return !! obj&& true;' – Znarkus 2010-06-17 07:38:13

+0

'false &&“foo”评估为* false *。 – Gumbo 2010-06-17 07:38:57

+0

@Gumbo:是的,是一个错字/ false/true,@Znarkus,是的,只是为了说明目的;)谢谢你们...... – CMS 2010-06-17 07:41:04

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"); 
+0

这就是为什么你应该使用'==='并明确地投射:'= ='类型转换规则是WTF的一些东西 – Christoph 2010-06-17 07:37:22

1

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

然而,使用不当这里只会真的是相关的,如果你把它分配给另一个变量 - 由于性能原因

var isJSON = (!!window.JSON); 

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