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

Javascript 你为什么要用!!在这种情况下的表达式中?angularjs api,javascript,Javascript,最近-学习和使用angularjs api。查看angular.isElement()的源代码。我从根本上理解使用表达式时“!!”对表达式返回值的作用,但不理解为什么要使用它-它不是多余的吗?搜索!!信息不多。到api页面 function isElement(node) { return !!(node && (node.nodeName // we are a direct element || (node.prop && node.

最近-学习和使用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
}
更新:关于被标记为重复-Thx。奇怪的是,我在最初的搜索中没有看到这个问题


尽管有很多长长的答案——阅读它们——但它们并没有真正回答我困惑的地方。这不是多余的吗?如果没有它,它不会变成真的吗!!。thx将值转换为布尔值<代码>本身不是运算符。它只是一个否定运算符
两次。

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


…当然它更短了

用于将“truthy”或值转换为
true
false
,相当于
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
。然后是第二个
将其反转,以便truthy值变为
true
,false值变为
false

至于为什么人们使用它而不是布尔值,这似乎只是一种惯例。它是简洁的,容易理解的大多数程序员,可能有一些类似的人如何做的事情在C或C++。是的

编辑。您想知道为什么在这种特殊情况下它不是多余的。我们可能不知道将什么类型的对象作为
节点传递给函数&&
在所有操作数都为truthy时,返回最右边的操作数,而不是true或false。尝试在不使用
的情况下重新定义
iElement
。我们得到以下回应:

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

事实上,这些结果在大多数情况下都会得到很好的处理——在任何
if
语句中,真值('something',Infinity)将被视为真,假值(undefined,0)将被视为假。但是,,API的用户希望它只返回
true
false
,如果允许它返回任何这些内容,偶尔会出现意外行为。

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


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

“它不是冗余的吗?”-如果您需要函数返回实际的布尔值,而不仅仅是truthy或falsy值,那么它就不是冗余的。我个人认为angularjs标记应该被删除。这是一个javascript语法问题,而不是angularjs问题。JS中的
&&
不会产生布尔值。```!!`将任何内容转换为布尔值。我不认为这是重复的。另一个问题更多的是“它做什么?”,而这是“你为什么要这样做,它不是多余的吗?”它不一定返回
false
——它返回第一个false值或最后一个truthy值。