你不知道的 JavaScript 系列中, 32 - 运算符的优先级

JavaScript 中的 && 和 || 运算符返回它们其中一个操作数的值,而非 true 或 false。在一个运算符两个操作数的情况下这比较好理解:

var a = 42;
var b = "foo";
a && b; // "foo"
a || b; // 42

那么两个运算符三个操作数呢?

var a = 42;
var b = "foo";
var c = [1,2,3];
a && b || c; // 'foo'
a || b && c; // 42

这说明 && 运算符先于 || 执行,而且执行顺序并非我们所设想的从左到右。原因就在于运 算符优先级。

对 && 和 || 来说,如果从左边的操作数能够得出结果,就可以忽略右边的操作数。我们将 这种现象称为“短路”(即执行最短路径)。

a ? b : c ? d : e;

? : 是右关联,它的组合顺序是以下哪一种呢?

• a ? b : (c ? d : e)
• (a ? b : c) ? d : e

答案是a ? b : (c ? d : e)

a && b || c ? c || b ? a : c && b : a

其中? :运算符的优先级比&&和||高还是低呢?执行顺序是这样?

a && b || (c ? c || (b ? a : c) && b : a)

还是这样?

(a && b || c) ? (c || b) ? a : (c && b) : a

答案是后者。因为&&运算符的优先级高于||,而||的优先级又高于? :