11.12 Conditional operator ?:

2010-05-22

ConditionalExpression :
LogicalORExpression
LogicalORExpression ? AssignmentExpression : AssignmentExpression

ConditionalExpressionNoIn :
LogicalORExpressionNoIn
LogicalORExpressionNoIn ? AssignmentExpression : AssignmentExpressionNoIn


Code: (Meta Ecma)
function evaluate(LogicalORExpression ? AssignmentExpression(1) : AssignmentExpression(2)) {
var lref = evaluate(LogicalORExpression);
if (ToBoolean(GetValue(lref))) {
var trueRef = evaluate(AssignmentExpression(1)); // the first one...
return GetValue(trueRef);
}
var falseRef = evaluate(AssignmentExpression(2)); // the second one...
return GetValue(falseRef);
}

The NoIn versions behave identical.

The specification notes that this implementation of the ternary operator is different from C and Java because it doesn't restrict the second AssignmentExpression to be a ConditionalExpression. This allows an assignment in both "arms" of the operator. It also eliminates a case of a comma expression as the center expression (??).