JavaScript中三元条件和逻辑and运算符的运算符优先级

JavaScript中三元条件和逻辑and运算符的运算符优先级,javascript,operator-precedence,Javascript,Operator Precedence,嘿,伙计们,我刚刚浏览了一个JS插件()的源代码,发现了以下代码行: return $parent && $parent.length ? $parent : $this.parent() 我不能完全理解上面这一行,我理解逻辑And(&&&)和三元条件运算符(…?…),但我似乎不理解在上面的示例中它们是如何相互作用的 现在,如果我在return语句之前添加console.log: console.log($parent && $parent.length ? $

嘿,伙计们,我刚刚浏览了一个JS插件()的源代码,发现了以下代码行:

return $parent && $parent.length ? $parent : $this.parent()
我不能完全理解上面这一行,我理解逻辑And(&&&)和三元条件运算符(
…?…
),但我似乎不理解在上面的示例中它们是如何相互作用的

现在,如果我在
return
语句之前添加
console.log

console.log($parent && $parent.length ? $parent : $this.parent());
我得到:

Object { 0: <li.dropdown.open>, length: 1, prevObject: Object, context: <a.dropdown-toggle>, selector: ".parent()" }
多谢各位


*请注意,这个问题的预编辑版本有一个不正确的标题,并且在仔细阅读之前没有解释问题的真正含义,因此,请不要对下面任何似乎在讨论“短路”而不是这个问题的实际主题(操作员优先)的答案投反对票仅仅是为了避开话题和粗心


这样读吧。这两个条件都必须是真实的。在JS中,只要条件为false,&&操作数就会返回false

如果
$parent
解析为“truthy”值,
$parent.length
(这意味着在本例中它不是0),那么它将返回
$parent
的值

如果
$parent
为false(很可能为null或未定义),或者parent的长度为0,则由于JavaScript的原因,它返回
$this.parent()

,您发布的表达式相当于:

return ($parent && $parent.length) ? $parent : $this.parent();
if($parent && $parent.length) {
  return $parent;
}
return $this.parent();
这是由于在
?:
之前对
&&
运算符进行了评估。或者,您可以使用
if-else
重写表达式:

if ($parent && $parent.length)
    return $parent;
else
    return $this.parent();

在javascript中,特别是在条件语句中,以下是正确的

if($parent) //checking whether the $parent variable has a value
您发布的条件语句是以下类型的文字

如果$parent不为null/undefined且$parent.length不为null/undefined,则返回$parent,否则返回$this.parent()

让我们再看看那句话

return $parent && $parent.length ? $parent : $this.parent();
第一个是三元算子的条件

$parent && $parent.length
这里的short-circuit操作符起作用,因为如果$parent为null/未定义,它将不会计算$parent.length(这将引发javascript异常)。如果不为null,则计算$parent.length是否为null/未定义

相同的代码可以编写为(仅为简洁起见,使用“null”)


这里,
$parent
$this
都是JQuery对象。行
$parent&&$parent.length$父项:$this.parent()
相当于:

return ($parent && $parent.length) ? $parent : $this.parent();
if($parent && $parent.length) {
  return $parent;
}
return $this.parent();
因此,
$parent&$parent.length
实际上被评估为:如果
$parent
$parent.length
不是
null
未定义的
0
假的
值,则返回
$parent
,否则返回
$this.parent()
我看待
如果($parent)的方式
是“检查$parent是真实的还是虚假的”。
if($parent && $parent.length) {
  return $parent;
}
return $this.parent();