嘿伙计们,我刚刚浏览了一个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()
谢谢。
<小时/> *请注意,此问题的预编辑版本标题不正确,并且在仔细观察之前没有解释问题究竟是什么,因此请不要低估任何下面的答案为了看不到主题和粗心而单独讨论“短路”代替这个问题的实际主题(运营商优先权)
答案 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
不是null
,undefined
,0
或{ {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();
}