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

标签 javascript

最近 - 学习和使用 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"值进入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可以大声朗读为“not not x”。第一个!将真值变为 falsetrue 的 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 的用户仍然希望它仅返回 truefalse如果允许返回任何这些东西,偶尔会出现意想不到的行为。

关于javascript - 为什么要用!!在这种情况下的表达式中? AngularJS API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27465691/

相关文章:

javascript - 在js文件中使用php var

javascript - 如何导出函数和数组

javascript - 可以将这个forwardRef移动到一个函数中以实现可重用吗?

javascript - 小部件内的类的冒泡事件?

javascript - Angularjs html 占位符和标题中的替代字符串

javascript - 获取div的顶部位置

javascript - 在react hook useState的set参数中运行函数有什么缺点吗?

javascript - 发送 FORM POST 之前删除参数

javascript - 如何检查 vue.js 数组中是否已存在项目?

javascript - 禁用第二个子单选按钮,然后选择 1 个选项,反之亦然