在if语句中测试多个函数调用的结果的意外行为

时间:2012-06-27 20:19:00

标签: javascript

假设我有以下非常简单的代码块:

<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语句的其余部分?

2 个答案:

答案 0 :(得分:5)

&&||运算符有时会被称为短路行为,所以是的,&&的评估会在操作数出现时立即停止false

同样,只要操作数为||true的评估就会完成。

这对于作为程序员的人来说通常是一个巨大的好处,尽管在您需要完整评估时,很少有情况(大多数情况下会产生重要的代码气味,例如示例中的副作用)。为此,您可以使用普通布尔值&|,或者将表达式显式地分解为单独的语句。

在访问房产之前必须检查某些东西是否为null(或其他方式不可用)的极其常见的情况下,可以看到它是如此好的原因:

if (something != null && something.whatever == 17) {
  ...
}

如果&&始终要评估表达式的两面,那么这个成语就不会起作用,而我们作为软件开发人员的生活会更加地狱化。

答案 1 :(得分:2)

因为if中的第二个条件没有执行。要使&&工作左右条件应解析为 truthy 值。口译员看到第一个条件是false,它直接跳过第二个条件,因为它不是真正的。