你为什么要用!!在这种情况下的表达式中?AngularJS API.

Why would you use !! in an expression in this case? angularjs api

本文关键字:表达式 API AngularJS 这种情况下 为什么      更新时间:2023-09-26

最近 - 学习和使用 Angularjs API。查看了angular.isElement((的源代码。我从根本上理解"!!"在使用表达式时对表达式的返回值的作用,但不明白为什么要使用它 - 它不是多余的吗?搜索!!信息不多。链接到 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
}

更新:关于被标记为重复项 - 谢谢。 奇怪的是我没有在原始搜索中看到这个问题。

虽然许多很长的答案 - 阅读它们 - 他们并没有真正回答我困惑的地方。在这种情况下不是多余的吗? 如果没有!.,它不会恢复真实吗 感谢

!!用于

将"真"或"假"值转换为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可以大声读作"不是x"。第一个!将真值转换为false,将假值转换为true。然后第二个!反转,使真值变为true,假值变为false

至于为什么人们使用它而不是Boolean,这似乎只是一个惯例。它简明扼要,大多数程序员都很容易理解,并且可能与人们在 C 或 C++ 中做事的方式有一些相似之处。它不是特别快。

编辑。您想知道为什么在这种特殊情况下它不是多余的。我们可能不知道什么类型的对象作为node传递给函数。 JavaScript 中的&&从左到右工作,如果所有操作数都是真数,则返回最右边的操作数,而不是真或假。尝试在没有!!的情况下重新定义isElement。我们收到以下响应:

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

事实上,这些结果在大多数时候都会得到很好的处理——在任何if语句中,真值('某物',无穷大(将被视为真,而假值(未定义,0(将被视为假值。但是,API 的用户仍然希望它只返回 truefalse,如果允许它返回任何这些内容,偶尔会出现意外行为。

!!var === Boolean(var) . 这并不总是正确的,但对于现代口译员来说却是如此。 在旧的解释器中,Boolean(var)总是返回true,因为它是一个对象,所以人们使用!!来获得等效值。

。当然它更短

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

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

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