繁体   English   中英

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

[英]Operator Precedence with Ternary Conditional and Logical And operators in JavaScript

大家好,我只是通过JS插件的源代码( dropdown.js ),遇到了以下代码行:

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

我无法完全掌握以上内容,我了解Logical 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()" }

确实是$this.parent()

另外,在我的情况下, $parent计算结果为false

这些是我的乐高积木,有人可以帮我摆放一下,让我清楚地了解它的工作原理:

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

谢谢。


*请注意,此问题的预编辑版本标题不正确,并且直到人们仔细研究它后才解释问题的实质,因此,请不要在下面可能会谈论的任何答案上加注“短路”代替此问题的实际主题(操作员优先),仅是为了寻找主题外和粗心的地方

由于JavaScript的运算符优先级 ,您发布的表达式等效于:

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

这是因为&&运算符在?:之前被求值。 另外,您可以使用if else重写表达式:

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

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

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

因此, $parent && $parent.length实际上被评估为: 如果$parent$parent.length不为nullundefined0false (伪造的值),则返回$parent ,否则返回$this.parent()

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

那样阅读。 这两个条件都必须为真。 在JS中,条件为false时,&&操作数将返回false

如果$parent解析为一个“真实”的值,而$parent.length也是如此(这意味着它不为0),则它将返回$parent的值。

如果$parent为false(很可能为null或未定义),或者parent的长度为0,则返回$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

短路运算符在这里起作用,因为如果$ parent为null / undefined,它将不会求值$ parent.length(这将引发JavaScript异常)。 如果不为null,则评估$ parent.length是否不为null / undefined。

可以将相同的代码编写为(仅出于简洁目的使用“ null”)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM