原型库使用!!操作者

时间:2010-06-18 02:19:45

标签: javascript

  

可能重复:
  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之间的差异。

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

2 个答案:

答案 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.attachEventundefined!isOperatrue,如果您不使用双重否定,{{1将Browser.IE改为undefined