Они идентичны?
Предположим, у вас есть:
var x = true;
И тогда у вас есть один из:
x && doSomething();
or
if(x) doSomething();
Есть ли какая-либо разница между двумя синтаксисами? Я наткнулся на хороший кусок сахара?
Они идентичны?
Предположим, у вас есть:
var x = true;
И тогда у вас есть один из:
x && doSomething();
or
if(x) doSomething();
Есть ли какая-либо разница между двумя синтаксисами? Я наткнулся на хороший кусок сахара?
Строго говоря, они будут давать одинаковые результаты, но если вы используете первый случай как условие для чего-то другого, вы получите разные результаты. Это связано с тем, что в случае x && doSomething()
doSomething()
вернет значение, указывающее на его успех.
var x; <boolean expr> && x = 'boolean expr was true';
. Может ли любой оператор, который следует за if(condition)
, следовать за &&
, давать тот же результат, даже если он не включает вызов метода?
- person wwaawaw; 03.10.2012
Нет, они не идентичны. В то время как if
— это инструкция, оператор AND
— это выражение.
Это означает, что вы можете использовать его результат в другом выражении, чего нельзя сделать с оператором if:
var result = x && doSomething();
Тем не менее, в вашем случае оба имеют одинаковый эффект. Используйте тот, который более удобочитаем и лучше представляет структуру вашей программы; Я бы рекомендовал оператор if.
statement
и expression
, которые вы упомянули в своем ответе, т.е. различия, ключевые слова и т. д.
- person Adrien Be; 16.09.2014
Заявленное @Steve x && doSomething()
является выражением,
тогда как if(x) doSomething();
— это оператор,
Как предложили @Daniel Li и @Bergi, подумайте:
вычисляется выражение (должно возвращаться значение здесь).
объявляется оператор (не должен возвращать значение здесь, подумайте о побочных эффектах).
( thatExpression );
thatExpression;
оба предполагают какое-то утверждение doNothingWithValueOf
.
Вы используете:
doSomething()
as an
IsMyObjectWhatever()
or MyObjectComputedValue()
,ModifyMyObject()
И затем: Вы используете x && doSomething()
как выражение?
В конечном итоге вы везде будете думать что-то вроде thisStatement( thatExpression );
, подумайте:
()
выражение,;
заявление.Очевидно, что это работает. не означает Это правильно.
Если менее очевидно, когда это будет иметь значение:
()(()())()();
can be right, (;)
is wrong.Одним словом, нет, два утверждения не равны, хотя в конкретных обстоятельствах, которые вы представляете, результат один и тот же.
x && doSomething();
— это выражение, сначала оценивается x
, потому что это И, а поскольку x
истинно, затем оценивается второй аргумент (doSomething()
). В данном случае это означает, что метод выполняется. Если бы x
было ложным, то doSomething() не выполнялся бы, так как результат выражения не может быть истинным.
if(x) doSomething();
- это утверждение. Проверяется значение x, и, если оно истинно, выполняется область действия оператора if.
Я собрал эту скрипту для демонстрации (с небольшими изменениями).
Поиграем в детектива.
Мы назовем наш первый подход Вызов условной стрелки, а второй подход Традиционный, если еще.
Мы создадим два отдельных случая в jsperf, чтобы оценить, насколько эти два подхода справедливы.
const VALUE = true;
const TEST = false;
//test 1
VALUE && !TEST && (() => {
console.log('print me!');
})();
Результат операций в секунду:
const VALUE = true;
const TEST = false;
//test 2
if(VALUE && !TEST) {
console.log('print me!');
}
Результат операций в секунду:
Как видите, с точки зрения производительности большой разницы нет, но незначительно Традиционный If Else выигрывал у условного вызова стрелки в большинстве случаев с незначительным числом. Это может иметь какое-то отношение к созданию неявной функции на лету.
Я также понял, что JavaScript в Chrome намного быстрее, чем выполнение JavaScript в FireFox.
Вот ссылка jsperf, которую вы можете запустить, чтобы оценить это самостоятельно.
https://jsperf.com/conditional-methods-vs-traditional-if-else/1