你为什么要用!!在这种情况下的表达? angularjs api

时间:2014-12-14 02:14:22

标签: javascript

最近 - 学习和使用angularjs api。查看angular.isElement()的源代码。我基本理解什么是“!!”使用它时表达式的返回值,但不理解为什么使用它 - 它不是多余的?搜索 !!信息不多。 Link到api页面。

function isElement(node) {
  return !!(node &&
    (node.nodeName  // we are a direct element
      || (node.prop && node.attr && node.find)));  // we have an on and find method part of     jQuery API
}
关于被标记为重复的

更新: - Thx。奇怪的是,我没有在原始搜索中看到这个问题。

虽然许多长篇答案 - 阅读它们 - 但它们并没有真正回答我感到困惑的地方。 在这种情况下不是多余的吗?如果没有!!它会不会返回真实。 thx

4 个答案:

答案 0 :(得分:2)

!!用于将“真实”或"falsey"值转换为truefalse,相当于Boolean()。例如

!!0              // false
!!1              // true
function Obj() {}
o = new Obj()
!!o              // true
!!''             // false
!!'hi'           // true
(1 && 3 && 4)    // 4
!!(1 && 3 && 4)  // true

!!x可以大声读出'not not x'。第一个!将真值改为false,将假值改为true。然后第二个!将其反转,以使真值变为true,并将假值变为false

至于为什么人们使用它而不是Boolean,这似乎只是一个惯例。大多数程序员都很简洁易懂,并且可能与人们如何用C或C ++做事情有些相似。它是not particularly faster

EDIT。你想知道为什么在这种特殊情况下它不是多余的。我们可能不知道将哪种类型的对象作为node传递给函数。 javascript中的&&来自left to right,如果所有操作数都是真实的,则返回最右边的操作数,而不是true或false。尝试在没有isElement的情况下重新定义!!。我们得到以下回复:

isElement('hi')                      // undefined
isElement(0)                         // 0
isElement(3)                         // undefined
isElement({nodeName: 'something'})   // 'something'
isElement({prop: 100, attr: this, find: Infinity})   // Infinity

这些结果实际上在大多数情况下都能很好地处理 - 在任何if语句中,truthy值('something',Infinity)将被视为true并且falsey值(undefined,0)被视为假的。但是,API的用户仍然希望它仅返回truefalse,如果允许返回任何这些内容,则偶尔会出现意外行为。

答案 1 :(得分:1)

!!var === Boolean(var)。这并非总是如此,但它适用于现代口译员。在旧解释器中,Boolean(var)始终返回true,因为它是一个对象,因此人们使用!!来获取等效值。

......当然它更短

答案 2 :(得分:0)

它将值转换为布尔值。 !!不是运营商本身。它只是否定运算符!两次。

答案 3 :(得分:-1)

&&运算符并不总是返回布尔值。它实际上返回false或第二个值。

这就是为什么使用!!强制它成为布尔值的原因,因为APIA显然应该返回一个。