Тернарные операторы в JavaScript без "Else"
Мне всегда приходилось ставить null
в условия else, которые ничего не имеют. Во всяком случае, вокруг? Например.
condition ? x = true : null;
в принципе, есть ли способ сделать:
condition ? x = true;
Теперь он отображается как синтаксическая ошибка
FYI, вот какой-то реальный пример кода:
!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null;
Ответы
Ответ 1
Прежде всего, тройное выражение не заменяет конструкцию if/else - ее эквивалент конструкции if/else, которая возвращает значение. То есть, предложение if/else - это код, трехмерное выражение - выражение , что означает, что оно возвращает значение.
Это означает несколько вещей:
- использовать тернарные выражения только тогда, когда у вас есть переменная с левой стороны
=
, которой должно быть присвоено возвращаемое значение
- использовать только тернарные выражения, когда возвращаемое значение должно быть одним из двух значений (или использовать вложенные выражения, если это подходит)
- каждая часть выражения (после? и после:) должна возвращать значение без побочных эффектов (выражение
x = true
возвращает true, поскольку все выражения возвращают последнее значение, но также изменяют x без x, оказывающих какое-либо влияние на возвращенный значение)
Короче говоря, "правильное" использование тернарного выражения
var resultofexpression = conditionasboolean ? truepart: falsepart;
Вместо вашего примера condition ? x=true : null ;
, где вы используете тернарное выражение для установки значения x
, вы можете использовать это:
condition && (x = true);
Это все еще выражение и, следовательно, не может пройти проверку, поэтому даже лучший подход будет
void(condition && x = true);
Последний пройдет проверку.
Но опять же, если ожидаемое значение является логическим, просто используйте результат самого выражения условия
var x = (condition); // var x = (foo == "bar");
UPDATE
По отношению к вашему образцу это, вероятно, более уместно:
defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';
Ответ 2
Нет, ему нужны три операнда. Вот почему их называют тернарными операторами.
Однако для того, что у вас есть в качестве примера, вы можете сделать это:
if(condition) x = true;
Хотя безопаснее иметь фигурные скобки, если вам нужно добавить более одного заявления в будущем:
if(condition) { x = true; }
Изменить: Теперь, когда вы указываете фактический код, к которому относится ваш вопрос:
if(!defaults.slideshowWidth)
{ defaults.slideshowWidth = obj.find('img').width()+'px'; }
Ответ 3
var x = condition || null;
Ответ 4
Чаще люди используют логические операторы для сокращения синтаксиса операторов:
!defaults.slideshowWidth &&
(defaults.slideshowWidth = obj.find('img').width()+'px');
Но в вашем конкретном случае синтаксис может быть еще проще
defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';
Этот код будет возвращать значение defaults.slideshowWidth
если для defaults.slideshowWidth
obj.find('img').width()+'px'
значение true и значение obj.find('img').width()+'px'
противном случае.
См. Короткое замыкание Оценка логических операторов для деталей.
Ответ 5
Вы можете написать
x = condition ? true : x;
Итак, x немодифицируется, когда условие ложно.
Это тогда эквивалентно
if (condition) x = true
ИЗМЕНИТЬ:
!defaults.slideshowWidth
? defaults.slideshowWidth = obj.find('img').width()+'px'
: null
Есть несколько альтернатив - я не говорю, что это лучше/хуже - просто альтернативы
Передача в нуле, поскольку третий параметр работает, потому что существующее значение равно null. Если вы реорганизовываете и меняете условие, тогда существует опасность, что это уже не так. Передача исходящей стоимости в качестве второго выбора в тройной защите от этого:
!defaults.slideshowWidth =
? defaults.slideshowWidth = obj.find('img').width()+'px'
: defaults.slideshowwidth
Безопаснее, но, возможно, не так приятно смотреть и набирать текст. На практике я, вероятно, напишу
defaults.slideshowWidth = defaults.slideshowWidth
|| obj.find('img').width()+'px'
Ответ 6
В вашем случае я вижу тройной оператор как избыточный. Вы можете назначить переменную непосредственно выражению, используя ||, && операторы.
!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null ;
станет:
defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';
Это более понятно, это более "javascript" стиль.
Ответ 7
Насчет просто
if (condition) { code if condition = true };