Может ли троичный оператор быть эквивалентен короткому замыканию с логическими операторами?

С помощью короткого замыкания вы можете предотвратить оценку части выражения:

let x = "", y = 123;
x && alert("foo"); // ""
y || alert("bar") // 123

Поскольку логические операции формируют выражения, вы можете использовать их в вызовах функций или в операторах возврата.

Но, в конечном счете, это не более чем условное ветвление и легко может быть достигнуто с помощью троичного оператора:

x ? alert("foo") : x; // ""
y ? y : alert("bar"); // 123

Это более читабельно и так же кратко. Есть ли причина использовать свойство короткого замыкания логических операторов, кроме иллюстративного термина?

1 ответ

Решение

Это правда (ну, почти правда), что

x ? x : y

логически эквивалентно

x || y

Тем не менее, они не эквивалентны с точки зрения того, что происходит, когда код выполняется. в ? : случай, подвыражение x может оцениваться дважды. В x || yЭто определенно только оценивается один раз. Для простых ссылок на переменные это не имеет значения, но если x это вызов функции, он может повлиять на поведение и, безусловно, повлияет на производительность.

(Тот факт, что одно из выражений может быть оценено дважды, я имел в виду под "почти" в первом предложении.)

Другие вопросы по тегам