0

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

<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

4

2 回答 2

5

和运算符有时称为短路行为,所以是的,&&只要操作数为 ,就停止计算。||&&false

||类似地,一旦操作数是, 的评估就结束了true

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

null在访问属性之前必须检查某些东西是否可用(或不可用)的极其常见的情况下,可以看出这是一件好事的原因:

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

如果&&总是对表达式的两边进行评估,那么这个习语就行不通了,我们作为软件开发人员的生活将会更加地狱般。

于 2012-06-27T20:20:28.807 回答
2

Because your second condition in if does not execute. For && to work both left and right conditions should resolve to truthy value. Interpreter sees that first condition is false, it skips second one straight away since it wasn't truthy.

于 2012-06-27T20:20:45.717 回答