解释这个复杂的javascript表达式的正确方法是什么?
some_condition ? a = b : c = d = e;
遵循运营商优先规则,我希望它是:
(some_condition ? a = b : c) = d = e;
但似乎分组实际上是:
编辑:(原始分组不清楚。请参阅下面的更新)
编辑:some_condition ? a = b : (c = d = e);
为什么会这样? (不,我没有写那段代码)
编辑:这似乎表明在Javascript中说?:
优先级高于=
并不完全正确。作为进一步的例子:
x = y ? a = b : c = d = e;
如果?:
的优先级高于=
(如C中所示),那么分组将是
x = ((y ? a = b : c) = (d = e));
而是(从答案中)我们拥有的是
x = (y ? a = b : (c = d = e));
?:
和=
的相对优先级似乎取决于 它们出现在表达式中
答案 0 :(得分:3)
如果您查看javascript precedence operators,assignments
的优先级低于conditional operator
,但根据 ecmascript 规范,Par。 11.12
11.12 Conditional Operator ( ? : )
Syntax
ConditionalExpression : LogicalORExpression
LogicalORExpression ? AssignmentExpression : AssignmentExpression
AssignmentExpression is evaluated as follows:
1. Let lref be the result of evaluating LogicalORExpression.
2. If ToBoolean(GetValue(lref)) is true, then
a. Let trueRef be the result of evaluating the first AssignmentExpression.
b. Return GetValue(trueRef).
...
因此,条件运算符会对每个赋值表达式的代码进行分组,并且按照每个人的说明进行操作。
也许我可能在这里错了,但我认为运算符优先级与js如何解析表达式相关,而不是
a = (b < c)? b : c;
(而不包含在AssignmentExpressions中)在这种情况下,赋值应该具有较低的优先级,因此Javascript将整个语句评估为
a = ((b < c)? b : c);
答案 1 :(得分:2)
这是一个缩写if else
声明
长格式
if(some condition)
{
a = b;
}
else
{
c = d = e;
}
答案 2 :(得分:0)
if( some_condition ){
a=b;
}else{
d=e;
c=d;
}
答案 3 :(得分:0)
var result = true ? a=b : c=d=e;
如果为真,则a等于b,结果等于b
var result = false ? a=b : c=d=e;
如果是假d等于e,c也等于e,结果为e
答案 4 :(得分:0)
您可能还会发现三元运算符的this definition有用。
通常用于根据条件分配内容,但这个似乎只是根据条件更改a
或c
和d
。
我经常看到val = isConditionTrue ? trueVal : falseVal;
之类的内容val
trueVal
或falseVal
基于isConditionTrue
。
答案 5 :(得分:0)
ConditionalExpression :
LogicalORExpression
LogicalORExpression ? AssignmentExpression : AssignmentExpression
a = b
是AssignmentExpression,c = d = e
也是。{/ p>