сложное условное выражение javascript - PullRequest
9 голосов
/ 02 апреля 2012

Как правильно интерпретировать это сложное выражение 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));

Относительный приоритет ?: и =, кажется, зависит от , где они появляются в выражении

Ответы [ 6 ]

3 голосов
/ 02 апреля 2012

Если вы посмотрите на javascript операторы приоритета , assignments имеют более низкий приоритет, чем conditional operator, но, согласно ecmascript specs, 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;

(а не когда оно содержится в Assignment Expressions), где в этомВ сценарии назначение должно иметь более низкий приоритет, поэтому Javascript оценивает весь оператор как

a = ((b < c)? b : c);
2 голосов
/ 02 апреля 2012

Это сокращенное выражение if else

полная форма будет

if(some condition)
{
 a = b;
}
else 
{
 c = d = e;
}
0 голосов
/ 02 апреля 2012

Условный оператор определяется как:

ConditionalExpression :
    LogicalORExpression
    LogicalORExpression ? AssignmentExpression : AssignmentExpression

a = b является AssignmentExpression , как и c = d = e.

0 голосов
/ 02 апреля 2012

Вы также можете найти это определение троичного оператора полезным.

Обычно это используется для назначения чего-либо на основе условия, но, похоже, это просто изменение a или c и d на основе условия.

Я часто вижу такие вещи, как val = isConditionTrue ? trueVal : falseVal; Тогда val может быть либо trueVal, либо falseVal в зависимости от isConditionTrue.

0 голосов
/ 02 апреля 2012

var result = true ? a=b : c=d=e;

если оно истинно, а равно b, а результат равен b

var result = false ? a=b : c=d=e;

если оно ложно, d равно e, c также равно e, а результат равен e

0 голосов
/ 02 апреля 2012
if( some_condition ){
    a=b;
}else{
    d=e;
    c=d;
}
...