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

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

var x=1;

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

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

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


person Nikki    schedule 17.06.2012    source источник
comment
Думаю, есть синтаксис var | var. Будьте осторожны, так как это потенциально трудно увидеть, особенно (IMO) трояки проблематичны. Используйте экономно.   -  person Jared Farrish    schedule 17.06.2012
comment
@JaredFarrish Разве не суть троичных в том, что их легче увидеть, чем использовать операторы if? Также интересно, о каком синтаксисе вы говорите.   -  person Hassan    schedule 17.06.2012
comment
Нет, я не думаю, что это проще во всех случаях. Все, что я думаю, состоит в том, чтобы либо поместить все это в одну строку (мои коды короче вашего), либо для конкретных, буквальных случаев с упрощенными результатами. Укладка троичных файлов особенно опасна, и ее следует избегать любой ценой. :)   -  person Jared Farrish    schedule 17.06.2012
comment
@Hassan - Я видел что-то вроде foo = bar | cat;, где, если первое неверно? null ?, он выпадает на второй. Я только видел это и не использую.   -  person Jared Farrish    schedule 17.06.2012
comment
Нет проблем сделать что-то вроде этого: var foo = bar || мыло; где bar - это ложное значение (помните, js имеет шесть различных ложных значений). Это сделает foo ценным мылом. Я часто использую его при создании пространств имен, где вы никогда не узнаете, установлено значение или нет, как это. var ns = ns || {}; ns.something = {} // другое пространство имен.   -  person Robin Heggelund Hansen    schedule 17.06.2012
comment
@JaredFarrish: Это a || b или a && b, иначе b всегда будет оцениваться.   -  person kennytm    schedule 17.06.2012
comment
Код предназначен для читателя, поэтому, если один подход не оказывает существенного влияния на выполнение кода по сравнению с другим подходом к тому же самому, краткость не должна делать подход лучшим. Я думаю, что полные if утверждения более читабельны / анализируются при сканировании страницы. Но я уверен, что другие не согласны.   -  person Jared Farrish    schedule 17.06.2012
comment
@JaredFarrish Хорошо, я согласен с вами, но такие конкретные случаи действительно встречаются, и троичные файлы действительно помогают с удобочитаемостью в этих случаях.   -  person Hassan    schedule 17.06.2012
comment
@KennyTM - Хорошо, спасибо. Это XOR?   -  person Jared Farrish    schedule 17.06.2012
comment
@RobinHeggelundHansen - Хорошие моменты, мне нравится эта форма на практике больше, чем троичные. Полагаю, я просто предвзято отношусь к троичным. Слишком легко позволить умнику сбежать, а с небольшим количеством воды и ночной закуской в ​​коде появляется гремлин.   -  person Jared Farrish    schedule 17.06.2012
comment
@JaredFarrish Я использую только тернарные операторы для установки значения, поскольку они менее подробны, чем if. но для всего остального (или если тернарное выражение становится слишком длинным и / или сложным) я использую конструкцию if, так как ее легче читать.   -  person Robin Heggelund Hansen    schedule 17.06.2012
comment
@JaredFarrish правда, вы должны использовать только код, если вы на 100% знаете, что делаете.   -  person Robin Heggelund Hansen    schedule 17.06.2012
comment
@JaredFarrish: a != b или a ^ b. И a, и b должны быть оценены, xor не имеет короткого замыкания.   -  person kennytm    schedule 17.06.2012
comment
@KennyTM - XOR достает мою козу. Я думаю, что XOR волшебник тоже его кормил. До сих пор остается загадкой, что он делает на практике с логической точки зрения.   -  person Jared Farrish    schedule 17.06.2012
comment
@KennyTM - Кроме того, есть ли имя для конструкции var a = b || c?   -  person Jared Farrish    schedule 17.06.2012
comment
@JaredFarrish: я не думаю, что есть конкретное имя, но см. stackoverflow.com/questions/1378619/javascript-operator и связанные с этим вопросы.   -  person kennytm    schedule 17.06.2012
comment
@KennyTM - Хотя это не обязательно название подхода для этой практики, я думаю, что короткое замыкание, вероятно, лучше всего подходит.   -  person Jared Farrish    schedule 17.06.2012
comment
condition && (codetorun) они работают так: && возвращает истину, только если оба значения истинны. Итак, если условие истинно, оно переходит ко второму, указанному в скобках, чтобы вычислить его первым, запустить его. затем верните истину / ложь. Но нас интересует только бег. Поэтому, когда это условие ложно, оно просто возвращает ложь, поскольку нет необходимости оценивать второй оператор, поскольку результат будет ложным.   -  person Muhammad Umer    schedule 10.08.2013
comment
statement || statement с другой стороны будет работать сначала один, а затем второй. если первое ложно; так противоположно &&. || возвращает значение, если только одно из них истинно, поэтому, если первое выражение ложно, второе будет оценено, если оно указано в скобках, затем будет выполнено и будет возвращено.   -  person Muhammad Umer    schedule 10.08.2013
comment
Правильный ответ на этот вопрос - это ответ NickC stackoverflow.com/a/11069295/1044366 К сожалению, он не был отмечен как правильный ответ.   -  person Sandeep Raju Prabhakar    schedule 08.07.2014


Ответы (8)


Это тоже вариант:

x==2 && dosomething();

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

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

if(x==2) dosomething();

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

person ajax333221    schedule 17.06.2012
comment
О, короткое замыкание, верно. Я думаю, что большинство опытных разработчиков и некоторых опытных профессионалов недооценивают удобочитаемость кода. - person Jared Farrish; 17.06.2012
comment
Технически фигурные скобки вам не нужны: if (1 - 1 === 0) $('.woot').text('Woot!'); Я использую эту форму все время с PHP, а теперь, когда я использую Coffeescript, я использую ее и в своем Javascript. - person b. e. hollenbeck; 14.09.2012
comment
Я лично считаю, что если это маленькое, если с одним исходом, если это правда ... быстрее и проще написать x == 2 && dosomething (); - person Dean Meehan; 18.02.2014
comment
да, в уменьшенной версии if loop меняется на Короткое замыкание. - person Mahi; 29.11.2016
comment
Это ужасно. - person Koray Tugay; 25.05.2017
comment
@KorayTugay Не могли бы вы рассказать о том, что вы считаете ужасным или почему? - person Mark; 07.01.2018
comment
Я бы хотел, чтобы в JavaScript был включен этот Ruby-подобный синтаксис: doSomething() if x === 2. Я не скучаю по Руби, но скучаю по ней. - person Chad Johnson; 26.07.2018
comment
Если вместо вызова такой функции, как dosomething(), вам нужно установить присвоение, вы не сможете использовать короткое замыкание. Это работает: if(x==2) foo='bar' Но это: x==2 && foo='bar' получает сообщение об ошибке: Uncaught SyntaxError: Invalid left-hand side in assignment - person Bruno Bronosky; 02.01.2020

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

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

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

if (x==2) doSomething();
person Nicole    schedule 17.06.2012
comment
Здесь мы можем добавить завершающую линию, вставленную как полную команду (в моем примере используется функция постепенного появления и исчезновения jquery) x == 2? $ (элемент) .fadeIn (): $ (элемент) .fadeIn (); Необязательно иметь возвращаемую переменную (например, var y в первом коде). - person Prageeth godage; 21.07.2014
comment
вы должны использовать тройные знаки =, чтобы логика была идеальной. как в var y = (x === 2? да: нет); - person fino; 25.12.2014

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

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

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

if (x==2) doSomething();
person Prescott    schedule 17.06.2012
comment
вы можете сделать это, даже если вы сделаете еще - person nmirceac; 25.01.2014

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

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

if (x==2) doSomething;
else doSomethingElse

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

if (x==2) doSomething;
person Ted Hopp    schedule 17.06.2012

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

Если вы оцениваете выражение внутри цикла _1 _ / _ 2_ с помощью тернарного оператора и хотите в результате continue или break - у вас возникнет проблема, потому что оба _5 _ & _ 6_ не являются выражениями, они утверждения, не имеющие никакого значения.

Это произведет 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;
  }
  • P.S - Этот код может вызвать недоумение. Просто говорю.. :)
person DotBot    schedule 04.11.2015

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

person nhahtdh    schedule 17.06.2012

Вероятно, самый короткий (на основе оператора ИЛИ и его приоритет)

x-2||dosomething()

let x=1, y=2;
let dosomething = s=>console.log(s); 

x-2||dosomething('x do something');
y-2||dosomething('y do something');

person Kamil Kiełczewski    schedule 11.04.2019