Тернарные операторы в JavaScript без “еще”

Я должен был всегда помещать null в еще условиях, которые ничего не имеют. Есть ли так или иначе вокруг этого? Например.

condition ? x = true : null;

в основном есть ли способ сделать:

condition ? x = true;

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

К вашему сведению вот некоторый реальный пример кода:

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null;
125
задан Mel 15 September 2017 в 08:59
поделиться

4 ответа

Прежде всего, троичное выражение не является заменой конструкции 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';
200
ответ дан 24 November 2019 в 01:00
поделиться

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

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

if(condition) x = true;

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

if(condition) { x = true; }

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

if(!defaults.slideshowWidth)
    { defaults.slideshowWidth = obj.find('img').width()+'px'; }
18
ответ дан 24 November 2019 в 01:00
поделиться
var x = condition || null;
11
ответ дан 24 November 2019 в 01:00
поделиться

Вы можете написать

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'
5
ответ дан 24 November 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: