Может ли троичный оператор быть эквивалентен короткому замыканию с логическими операторами?
С помощью короткого замыкания вы можете предотвратить оценку части выражения:
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
это вызов функции, он может повлиять на поведение и, безусловно, повлияет на производительность.
(Тот факт, что одно из выражений может быть оценено дважды, я имел в виду под "почти" в первом предложении.)