可能重复:
What does this expression mean “!!”
What does the !! operator (double exclamation point) mean in JavaScript?
以下是Prototype Javascript Library的片段:
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
之间的差异。
这只是一个惯例还是还有更多不明显的事情?
答案 0 :(得分:4)
这是一个相当普遍的技巧,用于将值强制转换为布尔类型,而不是使用(bool)
。 !window.attachEvent
会否定window.attachEvent
的真值,给你一个布尔值; !!window.attachEvent
否定了这一点,给你原始的真值,但是作为布尔值而不是window.attachEvent
答案 1 :(得分:4)
我不明白
!!window.attachEvent
和仅使用window.attachEvent
之间的差异。
理解这一点的关键是要知道Boolean Logical Operators可以返回操作数,而不是必然的布尔结果:
逻辑AND运算符(&&
)将返回第二个操作数的值,如果第一个操作数是真的:
true && "foo"; // "foo"
如果它本身是假的,它将返回第一个操作数的值:
undefined && "anything"; // undefined
NaN && "anything"; // NaN
0 && "anything"; // 0
因此,在代码段!!window.attachEvent && !isOpera
中,我们已经知道isOpera
是一个布尔值,!!
只会确保Browser.IE
也是一个布尔值。< / p>
示例:假设我们在Firefox中,window.attachEvent
为undefined
而!isOpera
为true
,如果您不使用双重否定,{{1将Browser.IE
改为undefined
。