Является ли ‹логическое выражение› && оператор() таким же, как if(‹логическое выражение›) оператор()?

Они идентичны?

Предположим, у вас есть:

var x = true;

И тогда у вас есть один из:

x && doSomething();

or

if(x) doSomething();

Есть ли какая-либо разница между двумя синтаксисами? Я наткнулся на хороший кусок сахара?


person wwaawaw    schedule 30.09.2012    source источник
comment
В вашем случае результат будет таким же.   -  person Anoop    schedule 30.09.2012
comment
Вы минимизируете свой код? Если это так, не делайте этого. Напишите четкий, читаемый код, а минификатор позаботится об изменениях.   -  person I Hate Lazy    schedule 30.09.2012
comment
@user1689607 user1689607 Лично я нахожу первый более лаконичным/элегантным/читабельным, предполагая, что он семантически идентичен.   -  person wwaawaw    schedule 03.10.2012


Ответы (5)


Строго говоря, они будут давать одинаковые результаты, но если вы используете первый случай как условие для чего-то другого, вы получите разные результаты. Это связано с тем, что в случае x && doSomething() doSomething() вернет значение, указывающее на его успех.

person Daniel Li    schedule 30.09.2012
comment
могу ли я использовать синтаксис для других типов операторов? В любом случае, это все выражения, не так ли? Я имею в виду, var x; <boolean expr> && x = 'boolean expr was true';. Может ли любой оператор, который следует за if(condition), следовать за &&, давать тот же результат, даже если он не включает вызов метода? - person wwaawaw; 03.10.2012
comment
Любое выражение, результатом которого является значение, может быть включено в логическую операцию. - person Daniel Li; 03.10.2012
comment
не все операторы в выражениях js? - person wwaawaw; 03.10.2012

Нет, они не идентичны. В то время как if — это инструкция, оператор AND — это выражение.

Это означает, что вы можете использовать его результат в другом выражении, чего нельзя сделать с оператором if:

var result = x && doSomething();

Тем не менее, в вашем случае оба имеют одинаковый эффект. Используйте тот, который более удобочитаем и лучше представляет структуру вашей программы; Я бы рекомендовал оператор if.

person Bergi    schedule 30.09.2012
comment
@AdrienBe: Что мне должны сказать эти ссылки? - person Bergi; 16.09.2014
comment
Некоторое дополнительное чтение для людей, заинтересованных в том, чтобы узнать больше о javascript statement и expression, которые вы упомянули в своем ответе, т.е. различия, ключевые слова и т. д. - person Adrien Be; 16.09.2014

Краткий ответ: Нет

Длинный ответ:

Заявленное @Steve x && doSomething() является выражением,

тогда как if(x) doSomething(); — это оператор,

Как предложили @Daniel Li и @Bergi, подумайте:

  • вычисляется выражение (должно возвращаться значение здесь).

  • объявляется оператор (не должен возвращать значение здесь, подумайте о побочных эффектах).

Почему это сбивает с толку?

  • JS позволяет нам писать ( thatExpression );
  • JS позволяет нам писать thatExpression;

оба предполагают какое-то утверждение doNothingWithValueOf.

Как выбрать?

Вы используете:

  • doSomething() as an
    • expression , think IsMyObjectWhatever() or MyObjectComputedValue(),
    • или как утверждение, подумайте ModifyMyObject()

И затем: Вы используете x && doSomething() как выражение?

В конечном итоге вы везде будете думать что-то вроде thisStatement( thatExpression );, подумайте:

  • () выражение,
  • ; заявление.

Тогда почему я должен выбирать?

person Ynut    schedule 03.05.2015

Одним словом, нет, два утверждения не равны, хотя в конкретных обстоятельствах, которые вы представляете, результат один и тот же.

x && doSomething(); — это выражение, сначала оценивается x, потому что это И, а поскольку x истинно, затем оценивается второй аргумент (doSomething()). В данном случае это означает, что метод выполняется. Если бы x было ложным, то doSomething() не выполнялся бы, так как результат выражения не может быть истинным.

if(x) doSomething(); - это утверждение. Проверяется значение x, и, если оно истинно, выполняется область действия оператора if.

Я собрал эту скрипту для демонстрации (с небольшими изменениями).

person Steve    schedule 30.09.2012
comment
Все ли выражения допустимы как самостоятельные операторы? - person wwaawaw; 01.10.2012

Поиграем в детектива.

Мы назовем наш первый подход Вызов условной стрелки, а второй подход Традиционный, если еще.

Мы создадим два отдельных случая в jsperf, чтобы оценить, насколько эти два подхода справедливы.

Условные вызовы стрелок

const VALUE = true;
const TEST = false;

//test 1
VALUE && !TEST && (() => {
    console.log('print me!');
})();

Результат операций в секунду:

  1. FireFox: 65 152
  2. Хром: 129 045

Традиционный, если еще

const VALUE = true;
const TEST = false;

//test 2
if(VALUE && !TEST) {
    console.log('print me!');
}

Результат операций в секунду:

  1. FireFox: 65 967
  2. Хром: 130 499

Заключение

Как видите, с точки зрения производительности большой разницы нет, но незначительно Традиционный If Else выигрывал у условного вызова стрелки в большинстве случаев с незначительным числом. Это может иметь какое-то отношение к созданию неявной функции на лету.

Я также понял, что JavaScript в Chrome намного быстрее, чем выполнение JavaScript в FireFox.

Вот ссылка jsperf, которую вы можете запустить, чтобы оценить это самостоятельно.

https://jsperf.com/conditional-methods-vs-traditional-if-else/1

person Dinesh Pandiyan    schedule 20.11.2018