Да, оба варианта эквивалентны.
function test(value) {
console.log(value);
value && console.log("\texecyted using AND");
if (value) console.log("\texecuted using if");
}
test(true);
test(false);
test("string");
test(""); //empty string
test(0);
test(null);
test(undefined);
test(1);
test({});
Однако, с учетом сказанного, использование JavaScript не является идиоматическим.Поэтому вам, вероятно, не следует использовать эту конструкцию, поскольку она может отбросить других разработчиков.Ваш пример хорошо это иллюстрирует, код, который выглядит как
function f (condition) {
condition && one(),
two();
}
function one() {
console.log("one");
}
function two() {
console.log("two")
}
f(false);
f(true);
Это действительно эффективно
function f(condition) {
if (condition) {
one();
}
two();
}
Итак, one()
будет выполняться несколько раз, тогда как two
будетвсегда быть выполненным.Однако, не зная правил приоритета, может показаться, что и one()
и two()
будут выполнены условно.Это простая ошибка, и даже проще, если это сложные условия и логика
person.account.moneyAmount > 0 && creditor.getDebt(person).moneyOwed > 0 && person.account.moneyAmount > creditor.getDebt(person).moneyOwed && (deductTaxes(payAndReturnAmount(person, creditor)), printStatement()), printHello()
Это немного преувеличено, но вполне возможно оказаться в подобной ситуации.Если ваш код прост как одно условие и одно действие, тогда вы экономите 2 байт от использования встроенного условия по сравнению с оператором if
condition && action()
if (condition) action()
^^
"extra" characters __||