Является ли <логическое выражение> && оператор () таким же, как 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 );
везде думай
()
выражение,;
заявление.
Тогда почему я должен выбрать?
- Очевидно, что "это работает". не означает "Это правильно".
Если менее очевидно, когда это будет иметь значение:
- просто думай
()(()())()();
может быть прав,(;)
неправильно - check @wwaawaw Javascript: разница между утверждением и выражением?
- или сообщение выражений против утверждений Акселя Раушмайера
- просто думай
Одним словом, два утверждения не равны, хотя в конкретных обстоятельствах вы представляете результат одинаковый.
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!');
})();
Результат операций в секунду:
- FireFox: 65,152
- Хром: 129,045
Традиционный Если Иное
const VALUE = true;
const TEST = false;
//test 2
if(VALUE && !TEST) {
console.log('print me!');
}
Результат операций в секунду:
- FireFox: 65,967
- Хром: 130,499
Заключение
Как видите, с точки зрения производительности разница не велика, а незначительно традиционна, если в большинстве случаев победа над условным вызовом стрелки выигрывает ничтожно малым числом. Это может быть связано с созданием неявной функции на лету.
Я также понял, что JavaScript в Chrome намного быстрее, чем в FireFox.
Вот ссылка на jsperf, которую вы можете запустить, чтобы оценить это для себя.
https://jsperf.com/conditional-methods-vs-traditional-if-else/1