Пропуск второго выражения при использовании сокращения if-else

290

Могу ли я написать if elseстенографию без else?

var x=1;

x==2 ? dosomething() : doNothingButContinueCode();   

Я заметил, что ставить nullдля других работ (но я понятия не имею, почему или если это хорошая идея).

Редактировать: Некоторые из вас, кажется, смущены, почему я потрудился попробовать это. Будьте уверены, это просто из любопытства. Мне нравится возиться с JavaScript.

Nikki
источник
Я думаю, что есть var | varсинтаксис. Осторожно, так как это потенциально трудно «увидеть», особенно (ИМО), поскольку тройные территории проблематичны. Используйте экономно.
Джаред Фарриш
@JaredFarrish Разве троицы не так просты, чтобы их было легче "увидеть", чем использовать операторы if? Кроме того, о каком синтаксисе вы говорите, это выглядит интересно.
Хасан
1
Нет, я не думаю, что они легче во всех случаях. «Весь смысл» в моей голове состоит в том, чтобы поместить все это в одну строку («мои коды короче, чем ваши») или для конкретных, буквальных случаев с упрощенными результатами. Укладка троичных растений особенно пагубна и ее следует избегать любой ценой. :)
Джаред Фарриш
1
@ Хасан - я видел что-то вроде foo = bar | cat;, где, если первое неверно? null ?, он «проваливается» на второй. Я только видел это, и не использую это.
Джаред Фарриш
3
@JaredFarrish: Это a || bили a && b, иначе bвсегда будет оцениваться.
Kennytm

Ответы:

263

Это также опция:

x==2 && dosomething();

dosomething()будет вызываться только если x==2оценивается как true. Это называется коротким замыканием .

Обычно это не используется в подобных случаях, и вам не следует писать такой код. Я рекомендую этот более простой подход:

if(x==2) dosomething();

Вы должны писать читаемый код всегда; если вас беспокоит размер файла, просто создайте его уменьшенную версию с помощью одного из множества JS-компрессоров. (например, Google Closure Compiler )

ajax333221
источник
10
Ох, короткое замыкание, верно. Читаемость кода недооценивается, я думаю, у большинства разработчиков среднего уровня и у некоторых «опытных профессионалов».
Джаред Фарриш
2
Технически вам не нужны скобки: if (1 - 1 === 0) $('.woot').text('Woot!'); я использую эту форму все время с PHP, и теперь, когда я использую Coffeescript, я использую ее и в своем Javascript.
быть Холленбеком
5
Лично я верю, что если оно маленькое, если с одним результатом, если оно истинно, то быстрее и проще написать x == 2 && dosomething ();
Дин Михан
9
if x==2 && doSomething() || doSomethingElse()
Агустин
1
Я хочу JavaScript включен этот рубин-подобный синтаксис: doSomething() if x === 2. Я не скучаю по Руби, но я скучаю по этому.
Чед Джонсон,
743

То, что у вас есть, это довольно необычное использование троичного оператора . Обычно он используется как выражение, а не как утверждение, внутри какой-либо другой операции, например:

var y = (x == 2 ? "yes" : "no");

Итак, для удобочитаемости (потому что то, что вы делаете, необычно), и потому, что оно избегает «другого», которое вам не нужно, я бы предложил:

if (x==2) doSomething();
Николь
источник
Здесь мы можем добавить завершающую строку, вставленную в качестве полной команды (в моем примере используется функция постепенного появления и исчезновения jquery) x == 2? $ (element) .fadeIn (): $ (element) .fadeIn (); Не обязательно иметь возвращаемую переменную (например, var y в первом коде).
Бог Prageeth
1
Вы должны использовать тройные знаки "=", чтобы логика была идеальной. как в var y = (x === 2? "yes": "no");
Fino
63

Другой вариант:

x === 2 ? doSomething() : void 0;
Buzinas
источник
3
Если кто-то не знает, зачем использовать void 0, я предлагаю прочитать эту ссылку
Carlinhos
20

Если вы не делаете ничего другого, почему бы не сделать:

if (x==2) doSomething();
Prescott
источник
4
Вы можете сделать это, даже если вы делаете другое
nmirceac
14

Использование nullхорошо для одной из ветвей троичного выражения. И троичное выражение прекрасно, как утверждение в Javascript.

Тем не менее, если говорить о стиле, то, если вы имеете в виду вызов процедуры, проще написать это с помощью if..else:

if (x==2) doSomething;
else doSomethingElse

или, в вашем случае,

if (x==2) doSomething;
Тед Хопп
источник
6

Крошечное дополнение к этой очень старой теме ..

Если your'e вычисление выражения внутри for/ whileпетли с тройным оператором, и хочет continueили breakкак результат - вы собираетесь иметь проблему , потому как continueи breakне выражение , они заявление без какого - либо значения.

Это будет производить Uncaught SyntaxError: Unexpected token continue

 for (const item of myArray) {
      item.value ? break : continue;
 }

Если вам действительно нужен однострочник, который возвращает оператор, вы можете использовать его вместо этого:

  for (const item of myArray) {
      if (item.value) break; else continue;
  }
  • PS - Этот код может поднять некоторые брови. Просто говорю.. :)
DotBot
источник
4

Технически, установка нуля или 0, или просто некоторого случайного значения там работает (так как вы не используете возвращаемое значение). Тем не менее, почему вы используете эту конструкцию вместо ifконструкции? Менее очевидно, что вы пытаетесь сделать, когда пишете код таким образом, так как вы можете запутать людей с no-op (null в вашем случае).

nhahtdh
источник