Пропускаючи другий вираз при використанні стенограми if-else


290

Чи можу я написати if elseстенографію без else?

var x=1;

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

Я помітив, що ставлять nullінші твори (але я не маю поняття, чому або якщо це гарна ідея).

Редагувати: Деякі з вас, здається, збентежені, чому я намагаюся спробувати це. Будьте впевнені, це суто з цікавості. Мені подобається возитися з JavaScript.


Я думаю, що є var | varсинтаксис. Обережно, оскільки це потенційно важко "побачити", особливо теренари (ІМО) є проблематичними. Використовуйте економно.
Джаред Фарріш

@JaredFarrish Чи не вся суть теренарів, які їх легше "побачити", ніж використовувати, якщо заяви? Крім того, що синтаксис, про який ви говорите, виглядає цікавим.
Хассан

1
Ні, я не думаю, що їм взагалі простіше у всіх випадках. Моя суть у цілому полягає в тому, щоб або поставити все це на один рядок ("мої коди коротші, ніж у вас"), або для конкретних, буквальних випадків із спрощеними результатами. Укладання тернарів особливо згубна і слід уникати будь-якої ціни. :)
Джаред Фарріш

1
@Hassan - я бачив щось подібне foo = bar | cat;, де, якщо перший неправдивий? null ?, вона "провалюється" до другої. Я бачив лише це, але не використовую.
Джаред Фарріш

3
@JaredFarrish: Це a || bабо a && b, інакше bзавжди буде оцінено.
kennytm

Відповіді:


263

Це також варіант:

x==2 && dosomething();

dosomething()буде називатися лише у тому випадку, якщо x==2його оцінюють як істинне. Це називається Коротке замикання .

Він не використовується зазвичай у таких випадках, і ви дійсно не повинні писати такий код. Я заохочую такий простіший підхід:

if(x==2) dosomething();

Ви повинні постійно писати читабельний код; якщо ви переживаєте за розмір файлу, просто створіть його мінімізовану версію за допомогою одного з багатьох компресорів JS. (наприклад, компілятор закриття Google )


10
О, коротке замикання, правильно. Читання коду недооцінене, я думаю, у більшості проміжних розробників та деяких "досвідчених професіоналів".
Джаред Фарріш

2
Технічно вам не потрібні дужки: if (1 - 1 === 0) $('.woot').text('Woot!'); я використовую цю форму весь час з PHP, і тепер, коли я приймаю Coffeescript, я також використовую її в своєму Javascript.
be hollenbeck

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 fade in fade out) x == 2? $ (елемент) .fadeIn (): $ (елемент) .fadeIn (); Не обов'язково мати змінну повернення (наприклад, var y у першому коді).
Прагетський бог

1
ви повинні використовувати потрійні знаки "=", щоб логіка була досконалою. як у var y = (x === 2? "так": "ні");
фіно


20

Якщо ви не робите інше, чому б не зробити:

if (x==2) doSomething();

4
ви можете це зробити, навіть якщо ви робите інше
nmirceac

14

Використання nullпрекрасно для однієї з гілок потрійного виразу. І потрійний вираз чудовий як заява в Javascript.

Що стосується стилю, однак, якщо ви маєте на увазі посилання на процедуру, то зрозуміліше написати це за допомогою if..else:

if (x==2) doSomething;
else doSomethingElse

або, у вашому випадку,

if (x==2) doSomething;

6

Крихітна добавка до цієї дуже старої нитки ..

Якщо ви оцінюєте вираз всередині 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 - Цей код може підняти брови. Просто кажу.. :)

4

Технічно введення нуля або 0 або просто якесь випадкове значення працює (оскільки ви не використовуєте значення повернення). Однак чому ви використовуєте цю конструкцію замість ifконструкції? Менш очевидно, що ви намагаєтеся робити, коли ви пишете код таким чином, оскільки ви можете плутати людей з неоперативним (нуль у вашому випадку).


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.