最近 - 学习和使用 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
}
更新:关于被标记为重复项的问题 - 谢谢。奇怪的是我在原始搜索中没有看到这个问题。
虽然有很多很长的答案-阅读它们-但它们并没有真正回答我感到困惑的地方。 在这种情况下不是多余的吗?如果没有!!,它不会返回true。谢谢
最佳答案
!!
用于转换“真实”或 "falsey"值进入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
可以大声朗读为“not not x”。第一个!
将真值变为 false
和 true
的 false 值。然后是第二个!
将其反转,使真值变为 true
false 值变为 false
.
至于为什么人们使用它而不是 Boolean
,这似乎只是一个约定。它简洁且易于大多数程序员理解,并且可能与人们在 C 或 C++ 中做事的方式有一些相似之处。是not particularly faster .
编辑。您想知道为什么在这种特殊情况下它不是多余的。我们可能不知道传递给函数的对象类型为 node
。 &&
在 javascript 中工作于 left to right如果所有操作数均为真,则返回最右边的操作数,而不是真或假。尝试重新定义isElement
没有 !!
。我们收到以下回复:
isElement('hi') // undefined
isElement(0) // 0
isElement(3) // undefined
isElement({nodeName: 'something'}) // 'something'
isElement({prop: 100, attr: this, find: Infinity}) // Infinity
事实上,这些结果在大多数情况下都能得到很好的处理——在任何 if
中。声明真值(“某物”,无穷大)将被视为 true,假值(未定义,0)将被视为 false。但是,API 的用户仍然希望它仅返回 true
或false
如果允许返回任何这些东西,偶尔会出现意想不到的行为。
关于javascript - 为什么要用!!在这种情况下的表达式中? AngularJS API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27465691/