假设我有以下非常简单的代码块:
<script>
function hasVal(field) {
console.log(field);
var ret = false;
return ret;
}
if(hasVal('#field1') && hasVal('#field2')) {
console.log('here');
}else {
console.log('there');
}
</script>
我期待它输出以下内容:
#field1
#field2
there
实际输出的是:
#field1
there
有人可以解释一下这里发生了什么吗?
Javascript从第一个函数调用中恢复if
后,是否会停止评估false
语句的其余部分?
答案 0 :(得分:5)
&&
和||
运算符有时会被称为短路行为,所以是的,&&
的评估会在操作数出现时立即停止false
。
同样,只要操作数为||
,true
的评估就会完成。
这对于作为程序员的人来说通常是一个巨大的好处,尽管在您需要完整评估时,很少有情况(大多数情况下会产生重要的代码气味,例如示例中的副作用)。为此,您可以使用普通布尔值&
和|
,或者将表达式显式地分解为单独的语句。
在访问房产之前必须检查某些东西是否为null
(或其他方式不可用)的极其常见的情况下,可以看到它是如此好的原因:
if (something != null && something.whatever == 17) {
...
}
如果&&
始终要评估表达式的两面,那么这个成语就不会起作用,而我们作为软件开发人员的生活会更加地狱化。
答案 1 :(得分:2)
因为if
中的第二个条件没有执行。要使&&
工作,左右条件应解析为 truthy 值。口译员看到第一个条件是false
,它直接跳过第二个条件,因为它不是真正的。