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

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

提问人:Kevin 提问时间:5/4/2020 最后编辑:jonrsharpeKevin 更新时间:5/4/2020 访问量:47

问:

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

var x;
false ? null : x = 1;

根据 MDN 算子的优先级,条件算子的算子优先级高于赋值算子 这意味着上面的代码应该给出一个错误,因为它实际上是像这样解析的:

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

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

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

上面的代码解析如下:

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

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

JavaScript 条件 运算符

评论


答:

-1赞 Giles Correia Morton 5/4/2020 #1

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

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

并变成这样,整个块变成(false ? null : x )x

var x;
x = 1;

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

评论

1赞 Quentin 5/4/2020
这显然是不正确的——jsbin.com/modugojidu/edit?js,console——没有抛出任何错误。
1赞 kmoser 5/4/2020
(false ? null : x )计算结果为 。undefined
1赞 Giles Correia Morton 5/4/2020
是的,我已经意识到我所犯的错误。
3赞 Pointy 5/4/2020 #2

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

false ? null : x = 1;

解析为

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

因为构造中的第一个表达式是语法中的短路表达式,所以表达式? :

x = 1 ? alert(x) : null;

解析为

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

评论

1赞 Pointy 5/4/2020
好吧,表达式语法中的所有内容都受到运算符优先级的“影响”;这是语法的核心。要分析条件表达式,解析器接受一个短路逻辑表达式,然后是 ,然后是赋值表达式,然后是 ,然后是另一个赋值表达式。当然,所有这些表达方式都可以简单得多。?:
1赞 Pointy 5/4/2020
实际上,它应该被认为是具有更高优先级的。这就是为什么你的第二个表达式是这样工作的。一旦解析器通过接受 来发现存在条件表达式,它就可以接受带有分隔符的较低优先级赋值表达式,因为语法使它变得明确。??:
1赞 Pointy 5/4/2020
逗号表达式不是赋值表达式;这是一个优先级较低的生产。
1赞 Pointy 5/5/2020
是的,没错。一旦你习惯了它,它就会使工作在 JavaScript 中非常有用。? :
1赞 Pointy 5/5/2020
这些名称基本上是语法表示运算符优先级的方式。短路表达式是可以涉及 和 运算符的表达式。这是有道理的,因为 左边的表达式是一个逻辑测试,用于查看要执行的分支。&&||?? :