最近 - 学习和使用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
答案 0 :(得分:2)
!!
用于将“真实”或"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
。然后第二个!
将其反转,以使真值变为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的用户仍然希望它仅返回true
或false
,如果允许返回任何这些内容,则偶尔会出现意外行为。
答案 1 :(得分:1)
!!var === Boolean(var)
。这并非总是如此,但它适用于现代口译员。在旧解释器中,Boolean(var)
始终返回true
,因为它是一个对象,因此人们使用!!
来获取等效值。
......当然它更短
答案 2 :(得分:0)
它将值转换为布尔值。 !!
不是运营商本身。它只是否定运算符!
两次。
答案 3 :(得分:-1)
&&
运算符并不总是返回布尔值。它实际上返回false
或第二个值。
这就是为什么使用!!
强制它成为布尔值的原因,因为APIA显然应该返回一个。