Как оценивается тернарный оператор в JavaScript?

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

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

  • Вычислить первый операнд.
  • Если результат первого операнда равен true, тогда оцените и верните второй операнд.
  • Повторите, оцените и верните третий операнд.

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

  • Все три операнда оцениваются.
  • Если результат первого операнда верен, верните результат второго операнда.
  • Else, верните результат третьего операнда.

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

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

Ответ 1

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

(1)? functionOne(): functionTwo()

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

function functionOne(){ 
   alert("one");
}
function functionTwo(){ 
   alert("two");
}

Ответ 2

В соответствии со спецификацией она работает как в альтернативе A:

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

  • Пусть lref будет результатом оценки LogicalORExpression.
  • Если ToBoolean(GetValue(lref)) true, тогда
    • Пусть trueRef будет результатом оценки первого AssignmentExpression.
    • Возврат GetValue(trueRef).
  • Else
    • Пусть falseRef является результатом оценки второго AssignmentExpression.
    • Возврат GetValue(falseRef).

Ответ 3

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

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

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

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

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

Ответ 4

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

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