2012-04-02 16 views
9

¿Cuál es la forma correcta de interpretar esta complicada expresión de javascript?expresión condicional complicada de javascript

some_condition ? a = b : c = d = e;

Siguiendo las reglas de prioridad del operador, que sería de esperar que sea:

(some_condition ? a = b : c) = d = e;

pero parece que la agrupación es en realidad:

EDIT: (La agrupación original no está claro. Consulte a continuación la actualización)

EDITAR: some_condition ? a = b : (c = d = e);

¿Por qué es esto así? (Y no, no escribí ese código)

EDITAR: Esto parece sugerir que en Javascript para decir ?: tienen una precedencia mayor que = no es del todo cierto. Como ejemplo adicional:

x = y ? a = b : c = d = e;

Si ?: tienen mayor precedencia que = (como en C), entonces la agrupación habría

x = ((y ? a = b : c) = (d = e));

sino más bien (a partir de las respuestas) lo que tenemos es

x = (y ? a = b : (c = d = e));

La precedencia relativa de ?: y = parece depender de donde que aparecen en la expresión

+1

Uh oh, mejor explique la [especificación] (http://es5.github.com/) otra vez ... – zzzzBov

+0

Eso es porque no ha entregado corchetes. Intenta dar corchetes. Debería funcionar como se esperaba. – sgowd

+0

no realmente ... en línea si no requiere corchetes o paréntesis. Consulte la respuesta de Simon West a continuación. – MilkyWayJoe

Respuesta

0
if(some_condition){ 
    a=b; 
}else{ 
    d=e; 
    c=d; 
} 
+0

También es efectivamente lo mismo que' d = e' y 'c = e' para ese último bit. – kiswa

+0

'd = e;' seguido de 'c = d;' no es técnicamente correcto, ya que 'd = e;' devuelve el valor de 'e' – zzzzBov

+0

Lo que es más importante,' -1' se debe a que esto no responde pregunta de ninguna manera. – zzzzBov

2

Thats una abreviada if else comunicado

la forma larga sería

if(some condition) 
{ 
a = b; 
} 
else 
{ 
c = d = e; 
} 
+1

Estoy bastante seguro de que @tyty entiende lo que hace el operador '?:', La pregunta era acerca de la precedencia del operador. – zzzzBov

+3

@zzzzBov, entonces tal vez debería reformular la pregunta. La forma en que arroja la pregunta sobre la perentétesis hace que parezca que realmente no se da cuenta de lo que es. –

0

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

si es verdad a se es igual a B y el resultado es igual a b

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

si es falsa d es igual a E, C también es igual a e y el resultado es E

0

También puede encontrar this definition del operador ternario útil.

Normalmente se usaría para asignar algo basado en la condición, pero este parece estar cambiando a o c y d según la condición.

frecuencia veo cosas como val = isConditionTrue ? trueVal : falseVal; Entonces val puede ser tanto o trueValfalseVal basado en isConditionTrue.

3

Si nos fijamos en Javascript precedence operators, assignments tienen una prioridad más baja que conditional operator pero, según ECMAScript características, 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). 
... 

lo tanto, el operador condicional evalúa que el código de agrupación de cada expresión de asignación y funciona como se explica a todo el mundo.

tal vez podría estar equivocado, pero creo que los operadores de precedencia se relacionan en lugar de cómo js analizar una expresión como

a = (b < c)? b : c; 

(y no cuando estén contenidos en los AssignmentExpressions), donde en este escenario la asignación debe tienen una prioridad más baja, por lo que Javascript evalúa toda la declaración como

a = ((b < c)? b : c); 
Cuestiones relacionadas