2010-06-18 27 views
4

可能重复:
What does this expression mean “!!”
What does the !! operator (double exclamation point) mean in JavaScript?原型库使用!!运营商

下面是Prototype JavaScript库的一个片段:

Browser: (function(){ 
    var ua = navigator.userAgent; 
    var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]'; 
    return { 
     IE:    !!window.attachEvent && !isOpera, 
     Opera:   isOpera, 
     WebKit:   ua.indexOf('AppleWebKit/') > -1, 
     Gecko:   ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1, 
     MobileSafari: /Apple.*Mobile/.test(ua) 
    } 
    })(), 

这一切都很好,我理解的目的创建一个浏览器对象。有一件事引起了我的注意,我一直无法弄清楚是使用双不操作者!在IE属性中为

如果您通读代码,您会发现它在许多其他地方。我不明白什么是!!window.attachEvent和只使用window.attachEvent之间的区别。

这只是一个惯例还是有更多的不是明显的?

+3

http://stackoverflow.com/questions/3059546/what-does-this-expression-mean – 2010-06-18 02:22:30

+0

@Daniel谢谢;我对此表示肯定,但是搜索'!!'相当困难 – 2010-06-18 02:24:00

回答

4

类型我不明白什么!!window.attachEvent之间的区别只使用window.attachEvent

理解这一点,关键是要知道,Boolean Logical Operators可以返回一个操作数,而不是一个布尔结果一定是:

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

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

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

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

所以,在代码段!!window.attachEvent && !isOpera中,我们已经知道isOpera是一个布尔值,!!只会确保Browser.IE也是一个布尔结果。

一个例子:假设我们是在Firefox,window.attachEventundefined!isOperatrue,如果你不使用双重否定,Browser.IEundefined代替false

+0

+1为例与优秀的解释。太好了! – Rajat 2010-06-18 02:42:38

4

这是一个相当常见的技巧,用于将值强制转换为布尔类型,而不是使用(bool)!window.attachEvent会否定window.attachEvent的真值,给你一个布尔值; !!window.attachEvent否定的是,给你原来的真值,但作为一个布尔值,而不是的window.attachEvent

+0

imo这是一个更好的答案,然后是接受的答案(其中更多地讨论&&然后!!)。 – 2010-06-18 03:19:18

+0

@Matt,真正的问题是“为什么使用'!window.attachEvent &&!isOpera'而不是'window.attachEvent &&!isOpera'”,OP并没有真正问'''做什么(事实上我认为OP已经知道)。理解你为什么需要'!!'在这种情况下,你需要知道'&&'操作符的行为,这可能会导致混淆,因为在其他语言中,逻辑操作符*总是*会产生一个布尔值。这就是为什么我谈论'&&' ;) – CMS 2010-06-18 04:16:01

+0

@CMS我认为他只是问什么是否定双重否定点,他说:“如果你通读代码,你会发现它在许多其他地方,我不明白什么是'!! window.attachEvent'和仅使用'window.attachEvent'之间的区别“;他的例子使用'&&'是我想的巧合。我发现你的答案教育虽然 – 2010-06-18 04:56:04