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

Javascript 有人能解释为什么条件运算符和赋值运算符在一起使用时表现得很奇怪吗?,javascript,operator-precedence,assignment-operator,conditional-operator,Javascript,Operator Precedence,Assignment Operator,Conditional Operator,有人能解释一下为什么下面的代码不会给出错误: var x; false ? null : x = 1; 根据,具有高于的运算符优先级, 这意味着上面的代码应该给出一个错误,因为它的实际解析如下: var x; (false ? null : x) = 1 var x; x = (1 ? alert(x) : null); 但是它没有给出一个错误,而这是按照预期工作的: var x; x = 1 ? alert(x) : null; 上述代码的解析方式如下: var x; (false ?

有人能解释一下为什么下面的代码不会给出错误:

var x;
false ? null : x = 1;
根据,具有高于的运算符优先级, 这意味着上面的代码应该给出一个错误,因为它的实际解析如下:

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
var x;
x = (1 ? alert(x) : null);

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

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

varx;
(假?空:x)=1;
并且
(false?null:x)
变为
x
,因此整个块变为

varx;
x=1;

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

如果查看实际语法,条件运算符的两个“分支”是赋值表达式。因此,

被解析为

false ? (null) : (x = 1);
x = (1 ? alert(x) : null);
因为
中的第一个表达式是:构造是语法中的一个短路表达式

x = 1 ? alert(x) : null;
被解析为

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

这显然是不正确的--不会抛出错误。
(false?null:x)
的计算结果为
未定义。
。是的,我已经意识到我犯的错误。表达式语法中的所有内容都受到运算符优先级的“影响”;这是语法的核心。要解析条件表达式,解析器接受一个短路逻辑表达式,然后是
,然后是赋值表达式,然后是
,然后是另一个赋值表达式。当然,所有这些表达式都可以简单得多。实际上,应该认为具有更高优先级的是
。这就是为什么你的第二个表达式是这样工作的。一旦解析器通过接受
发现存在条件表达式,它就可以接受带有
分隔符的低优先级赋值表达式,因为语法使其明确无误。逗号表达式不是赋值表达式;这是一个低优先级的产品。是的,没错。它使
?:在JavaScript中会非常有用。这些名称基本上就是语法表示运算符优先级的方式。短路表达式是一种可能涉及
&&
|
运算符的表达式。这是有道理的,因为
左侧的表达式是一个逻辑测试,用于查看
的哪个分支:以执行。