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

问题描述 投票:0回答:1

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

var x;
false ? null : x = 1;

根据MDN-operator precedenceconditional operator的运算符优先级高于assignment operator,这意味着上面的代码应该给出错误,因为它实际上是这样解析的:

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

但是它没有给出错误,但是可以正常工作:

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

上面的代码解析如下:

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

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

javascript operator-precedence assignment-operator conditional-operator
1个回答
0
投票

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

false ? null : x = 1;

解析为

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

-2
投票

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

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

[(false ? null : x )变为x,所以整个块变为

var x;
x = 1;

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

© www.soinside.com 2019 - 2024. All rights reserved.