Я должен был всегда помещать null
в еще условиях, которые ничего не имеют. Есть ли так или иначе вокруг этого? Например.
condition ? x = true : null;
в основном есть ли способ сделать:
condition ? x = true;
Теперь это обнаруживается как синтаксическая ошибка
К вашему сведению вот некоторый реальный пример кода:
!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null;
Прежде всего, троичное выражение не является заменой конструкции 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';
Нет, для этого нужны три операнда. Вот почему они называются тернарными операторами.
Однако для того, что у вас есть в примере, вы можете сделать это:
if(condition) x = true;
Хотя безопаснее иметь фигурные скобки, если вам нужно добавить более одного оператора в будущем:
if(condition) { x = true; }
Изменить: Теперь, когда вы указываете фактический код, к которому относится ваш вопрос:
if(!defaults.slideshowWidth)
{ defaults.slideshowWidth = obj.find('img').width()+'px'; }
Вы можете написать
x = condition ? true : x;
Так, чтобы x не изменялся, когда условие ложно.
Это эквивалентно
if (condition) x = true
EDIT:
!defaults.slideshowWidth
? defaults.slideshowWidth = obj.find('img').width()+'px'
: null
Есть пара альтернатив - я не говорю, что они лучше/хуже - просто альтернативы
Передача null в качестве третьего параметра работает, потому что существующее значение равно null. Если вы проведете рефакторинг и измените условие, то есть опасность, что это уже не так. Передача существующего значения в качестве второго параметра в троичной системе защищает от этого:
!defaults.slideshowWidth =
? defaults.slideshowWidth = obj.find('img').width()+'px'
: defaults.slideshowwidth
Безопаснее, но, возможно, не так приятно выглядит, и больше опечаток. На практике я бы, вероятно, написал
defaults.slideshowWidth = defaults.slideshowWidth
|| obj.find('img').width()+'px'