JavaScript条件语句顺序评估

38

当表达式中的一个条件结果为false时,我能指望JavaScript立即失败吗?

f = {'a':'b'};
if (f.a !== undefined || f.a === 'b') {
  // Is this OK to use, because the second condition will never be evaluated?
}

1
从我在代码中看到的,你的第二个条件总是被评估,因为(f.a!==undefined)等于true。 - a1ex07
1
如果第一个条件为假,则将评估第二个条件。 - RobG
1个回答

60

是的,这被称为短路求值

使用AND逻辑运算符时,如果第一个条件评估为false,则第二个条件将不会被评估,因为该条件已经足够满足。

使用OR逻辑运算符时,如果第一个条件为false,它将评估第二个条件。否则,如果第一个条件为true,它将不会评估第二个条件(没有必要)。

这也是为什么你会看到...

var a = function(b) {
   b = b || 7;
}

1
“b = b || 7;”形式通常被用作一种简写方式,为当b未定义时提供默认值,因为undefined被评估为false,但是实际上这并不起作用,因为b可能包含其他几个值,它们都被评估为false(0、null、空字符串,当然false也都被评估为false)。当然,如果您确信所有这些其他值都应该被覆盖为默认值,那就没问题了... - nnnnnn
@nnnnn 它并不完美,但大多数情况下,它非常有用。 - alex
我认为正确的方式应该是 b = typeof b == "undefined"?7:b; - JVE999
1
@JVE999 这是一种方法,如果你必须确定无法以同一方式处理所有“falsey”值。 - alex
@JVE999 其实我认为在这里使用 typeof 是不必要的,因为你已经定义了 b,所以变量不存在的可能性已经不存在了。所以你可以直接使用 == null 来检查 nullundefined(通常在这种检查中它们是可等价的)。 - alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接