有人可以解释为什么条件运算符和赋值运算符一起使用时会表现得很奇怪吗?

Can someone explain why the conditional operator and the assignment operator behave strangely when used together?

谁能解释一下为什么下面的代码不会报错:

var x;
false ? null : x = 1;

根据MDN-operator precedence the conditional operator has a higher operator precedence than the assignment operator, 这意味着上面的代码应该给出错误,因为它实际上被解析为:

var x;
(false ? null : x) = 1

但它没有给出错误,而这按预期工作:

var x;
x = 1 ? alert(x) : null;

上面的代码被解析为:

var x;
x = (1 ? alert(x) : null);

因为条件运算符具有更高的优先级,但是为什么在我的第一段代码中,如果条件运算符的优先级高于赋值运算符,它不会报错?

因为条件运算符的优先级高于赋值运算符,所以您的第一个块本质上是

var x;
(false ? null : x ) = 1;

(false ? null : x ) 变成 x 所以整个块变成

var x;
x = 1;

如果它是 (true ? null : x ) 那么第二行将等于 null = 1 这不是正确的语法,但我相信不会抛出错误。

如果看实际语法,条件运算符的两个"branches"是赋值表达式。因此,

false ? null : x = 1;

被解析为

false ? (null) : (x = 1);

因为 ? : 构造中的 first 表达式在文法中是一个 短路表达式 ,表达式

x = 1 ? alert(x) : null;

被解析为

x = (1 ? alert(x) : null);