有人可以解释为什么下面的代码不会给出错误:
var x;
false ? null : x = 1;
根据MDN-operator precedence,conditional operator的运算符优先级高于assignment operator,这意味着上面的代码应该给出错误,因为它实际上是这样解析的:
var x;
(false ? null : x) = 1
但是它没有给出错误,但是可以正常工作:
var x;
x = 1 ? alert(x) : null;
上面的代码解析如下:
var x;
x = (1 ? alert(x) : null);
因为条件运算符的优先级更高,但是为什么在我的第一个代码中,如果条件运算符的优先级高于赋值运算符,为什么它不会给出错误?
如果您查看实际的语法,则条件运算符的两个“分支”为赋值表达式。因此,
false ? null : x = 1;
解析为
false ? (null) : (x = 1);
因为条件运算符的优先级比赋值运算符的优先级高,所以您的第一个块实际上是
var x;
(false ? null : x ) = 1;
[(false ? null : x )
变为x
,所以整个块变为
var x;
x = 1;
如果是(true ? null : x )
,那么第二行将等于null = 1
,这是不正确的语法,但我相信不会抛出错误。