Как троичный оператор оценивается в JavaScript? - PullRequest
13 голосов
/ 24 февраля 2011

Что касается троичного (? :) оператора в JavaScript, я хотел бы знать, как он оценивается интерпретатором JavaScript типичного браузера:

Альтернатива A:

  1. Оценитьпервый операнд.
  2. Если результат первого операнда равен true, вычислить и вернуть второй операнд.
  3. В противном случае вычислить и вернуть третий операнд.

Альтернатива B:

  1. Все три операнда вычисляются.
  2. Если результат первого операнда равен true, вернуть результат второго операнда.
  3. Иначе, верните результат третьего операнда.

Альтернатива C:

Конечно, если ни альтернатива A, ни альтернатива B точно не описывают, как работает троичный оператор, пожалуйста, объясните мне, какэто работает.

Ответы [ 4 ]

10 голосов
/ 24 февраля 2011

Согласно спецификации работает как в Альтернатива A :

Производство ConditionalExpression : LogicalORExpression ? AssignmentExpression : AssignmentExpression оценивается следующим образом:

  1. Пусть lref будет результатом оценки LogicalORExpression.
  2. Если ToBoolean(GetValue(lref)) равно true, то
    • Пусть trueRef будет результатом вычисления первого AssignmentExpression.
    • Возврат GetValue(trueRef).
  3. Else
    • Пусть falseRef будет результатом вычисления второго AssignmentExpression.
    • Возврат GetValue(falseRef).
6 голосов
/ 24 февраля 2011

«Альтернатива А»:

(1)? functionOne(): functionTwo()

Если вы поместите простое предупреждающее сообщение на обе функции, только functionOne будет отображать его сообщение.

function functionOne(){ 
   alert("one");
}
function functionTwo(){ 
   alert("two");
}
3 голосов
/ 24 февраля 2011

Тернарный оператор выполняет ленивые вычисления по нескольким причинам.

  1. Неэффективно оценивать все операнды, когда вы собираетесь возвращать либо if, либо else
  2. Выполнение ленивых вычисленийпозволяет вам делать такие вещи, как x != 0 ? 10 / x : 10; Если бы он вычислял все одновременно, вы бы получили ошибку деления на ноль, если бы х было ноль
2 голосов
/ 24 февраля 2011

Запустите это и узнайте:

function bool() {
    alert('bool');
    return false;
}

function a() {
    alert('a');
    return 'A';
}

function b() {
    alert('b');
    return 'B';
}

alert(bool() ? a() : b())
...