运算符优先于三元条件和逻辑以及JavaScript中的运算符

时间:2015-04-08 06:32:51

标签: javascript operator-precedence

嘿伙计们,我刚刚浏览了一个JS插件(dropdown.js)的来源,并遇到了以下代码:

return $parent && $parent.length ? $parent : $this.parent()

我无法完全掌握上述内容,我理解逻辑和(&&)以及三元条件运算符(... ? ... : ...),但我似乎无法理解它们如何在上面的例子。

现在,如果我在console.log声明之前添加return

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

我明白了:

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

确实是$this.parent()

此外,我的案例中的$parent评估为false

所以这些是我的Lego作品,有人可以把它放在我的位置,并让我清楚地了解它是如何工作的:

return $parent && $parent.length ? $parent : $this.parent()

谢谢。

<小时/> *请注意,此问题的预编辑版本标题不正确,并且在仔细观察之前没有解释问题究竟是什么,因此请不要低估任何下面的答案为了看不到主题和粗心而单独讨论“短路”代替这个问题的实际主题(运营商优先权)

5 个答案:

答案 0 :(得分:5)

由于JavaScript operator precedence,您发布的表达式相当于:

return ($parent && $parent.length) ? $parent : $this.parent();

这是因为在&&之前评估了?:运算符。或者,您可以使用if else重写表达式:

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

答案 1 :(得分:1)

这里,$parent$this都是JQuery对象。第$parent && $parent.length ? $parent : $this.parent()行等同于:

if($parent && $parent.length) {
  return $parent;
}
return $this.parent();

所以$parent && $parent.length实际上评估为:如果$parent$parent.length不是nullundefined0或{ {1}}(假值),然后返回false,否则返回$parent

答案 2 :(得分:0)

return ($parent && $parent.length) ? $parent : $this.parent()

这样读。这两个条件都必须是真实的。在JS中,&amp;&amp;一旦条件为假,操作数将返回false

答案 3 :(得分:0)

如果$parent解析为“truthy”值,$parent.length(这意味着它不是0),那么它将返回{{1}的值}。

如果$parent为假(很可能为null或未定义),或者父长度为0,则返回$parent

答案 4 :(得分:0)

在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

这里的短路运算符有效,因为如果$ parent为null / undefined,它将不会计算$ parent.length(这将抛出一个javascript异常)。如果它不为null,则计算$ parent.length是否为null / undefined。

相同的代码可以写成(仅为简洁起见使用'null')

if($parent != null && $parent.length !=null) {
    return $parent;
} else {
    return $this.parent();
}