Тернарные операторы в JavaScript без «остального» - PullRequest
114 голосов
/ 29 мая 2010

Мне всегда приходилось ставить null в других условиях, в которых ничего нет. Есть ли что-нибудь вокруг этого? Э.Г.

condition ? x = true : null;

в принципе, есть ли способ сделать:

condition ? x = true;

Теперь это отображается как синтаксическая ошибка

К вашему сведению, вот пример кода:

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null;

Ответы [ 7 ]

187 голосов
/ 29 мая 2010

Прежде всего, троичное выражение не является заменой для конструкции 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';
18 голосов
/ 29 мая 2010

Нет, для этого нужно три операнда. Вот почему они называются троичными операторами.

Однако, для примера, вы можете сделать это:

if(condition) x = true;

Хотя безопаснее иметь фигурные скобки, если вам нужно добавить более одного утверждения в будущем:

if(condition) { x = true; }

Редактировать: Теперь, когда вы упомянули фактический код, к которому относится ваш вопрос:

if(!defaults.slideshowWidth)
    { defaults.slideshowWidth = obj.find('img').width()+'px'; }
11 голосов
/ 29 мая 2010
var x = condition || null;
8 голосов
/ 01 октября 2015

Чаще люди используют логические операторы для сокращения синтаксиса оператора:

!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' в противном случае.

Подробнее см. Оценка короткого замыкания логических операторов.

4 голосов
/ 29 мая 2010

Вы могли бы написать

x = condition ? true : x;

Так что x не изменяется, когда условие ложно.

Это эквивалентно

if (condition) x = true

РЕДАКТИРОВАТЬ:

!defaults.slideshowWidth 
      ? defaults.slideshowWidth = obj.find('img').width()+'px' 
      : null 

Есть несколько альтернатив - я не говорю, что они лучше / хуже - просто альтернативы

Передача нулевого значения в качестве третьего параметра работает, поскольку существующее значение равно нулю. Если вы выполните рефакторинг и измените условие, существует опасность, что это больше не так. Передача существующего значения в качестве 2-го выбора в тройной страже против этого:

!defaults.slideshowWidth = 
      ? defaults.slideshowWidth = obj.find('img').width()+'px' 
      : defaults.slideshowwidth 

Безопаснее, но, возможно, не так приятно смотреть, и больше печатать. На практике я бы, наверное, написал

defaults.slideshowWidth = defaults.slideshowWidth 
               || obj.find('img').width()+'px'
2 голосов
/ 30 сентября 2015

В вашем случае я вижу троичный оператор как избыточный. Вы можете присвоить переменную непосредственно выражению, используя операторы ||, &&.

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null ;

станет:

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';

Это более понятно, это больше стиль "javascript".

0 голосов
/ 11 января 2019

Как насчет просто

    if (condition) { code if condition = true };
...