Как оценивается тернарный оператор в 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 были равны нулю