Javascript 你为什么要用!!在这种情况下的表达式中?angularjs api
最近-学习和使用angularjs api。查看angular.isElement()的源代码。我从根本上理解使用表达式时“!!”对表达式返回值的作用,但不理解为什么要使用它-它不是多余的吗?搜索!!信息不多。到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.
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值。