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

Mar*_*iek 0 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>
Run Code Online (Sandbox Code Playgroud)

我期待它输出以下内容:

#field1
#field2
there
Run Code Online (Sandbox Code Playgroud)

实际输出的是:

#field1
there
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这里发生了什么吗?

if一旦Javascript false从第一个函数调用返回,它是否会停止评估其余的语句?

Poi*_*nty 5

&&||运营商有什么有时也被称为短路行为,所以是的,评价&&停止只要一个操作数false.

同样,||只要操作数是,就完成评估true.

这通常是一个巨大的好处,你作为一个程序员,但也有极少数情况下(其中大部分承担显著代码味道,就像在你的榜样副作用),当你想完整的评估.对于您可以使用普通布尔&|,或者明确地分解你的表达成单独的语句.

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

if (something != null && something.whatever == 17) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

如果&&总是要评估表达的两个方面,那个成语就不会起作用,而我们作为软件开发人员的生活将更加地狱般.

  • 嗯,它始终是一个学习经验,处理你没写的代码中的问题.:-)(事实上,这就是为什么Stackoverflow本身如此有教育意义!) (2认同)