Тернарные операторы в 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 };