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

Эти два идентичны?

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

var x = true;

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

x && doSomething();

или же

if(x) doSomething();

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

5 ответов

Решение

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

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

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

var result = x && doSomething();

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

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

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

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

в то время как if(x) doSomething(); это утверждение,

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

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

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

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

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

оба предполагая какой-то doNothingWithValueOf заявление.

Как выбрать?

Ты используешь:

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

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

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

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

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

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

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

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

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

Давайте играть в детектива.

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

Мы создадим два отдельных случая в 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

Заключение

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

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

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

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

Другие вопросы по тегам