【问题标题】:Prototype Library use of !! operator [duplicate]原型库的使用!!运算符 [重复]
【发布时间】:2011-03-05 06:09:28
【问题描述】:

可能的重复:
What does this expression mean “!!”
What does the !! operator (double exclamation point) mean in JavaScript?

这是来自 Prototype Javascript 库的 sn-p:

  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 有什么区别。

这只是一个约定,还是有更多不明显的地方?

【问题讨论】:

标签: javascript


【解决方案1】:

我不明白!!window.attachEvent 和只使用window.attachEvent 之间有什么区别。

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

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

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

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

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

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

举个例子:假设我们在 Firefox 中,window.attachEventundefined!isOperatrue,如果你不使用双重否定,Browser.IE 将是 undefined 而不是 @987654337 @。

【讨论】:

  • +1 以获得出色的示例说明。太好了!
【解决方案2】:

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

【讨论】:

  • imo 这是一个比公认的更好的答案(它更多地谈论 && 然后!!)。
  • @Matt,真正的问题是“为什么使用!!window.attachEvent && !isOpera 而不仅仅是window.attachEvent && !isOpera”,OP 并没有真正问!! 做了什么(我认为 OP 已经知道的事实) .要了解为什么在这种情况下需要 !!,您需要知道 && 运算符的行为方式,这可能会导致混淆,因为在其他语言中,逻辑运算符 always 会产生一个布尔值。这就是我谈论&& 的原因;)
  • @CMS 我认为他只是在问双重否定的意义是什么,他说“如果您阅读代码,您会在许多其他地方找到它。我不明白有什么区别在!!window.attachEvent 和仅使用window.attachEvent"之间;我认为他的示例使用&& 只是一个巧合。我发现你的回答很有教育意义
猜你喜欢
  • 2011-09-28
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 2020-08-19
相关资源
最近更新 更多