![](/img/trans.png)
[英]Javascript ternary operator with two true (?) conditional operators
[英]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
不为null
, undefined
, 0
或false
(伪造的值),则返回$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.