← Назад к вопросам

Какие знаешь особенности оператора &&?

1.0 Junior🔥 161 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какие знаешь особенности оператора &&?

Оператор && (логический AND) — это один из самых важных операторов в JavaScript. Кроме логических операций, он имеет интересные особенности, которые часто используются для условного рендеринга, коротких замыканий и других паттернов.

Базовое поведение

// && возвращает ПЕРВОЕ falsy значение ИЛИ последнее значение, если все truthy

console.log(true && true);      // true
console.log(true && false);     // false
console.log(false && true);     // false
console.log(5 && 10);           // 10 (оба truthy)
console.log(5 && 0);            // 0 (0 — falsy)
console.log(0 && 5);            // 0 (0 — falsy, вернёт его)
console.log('' && 'hello');     // '' (пустая строка — falsy)
console.log('hello' && 'world');// 'world' (оба truthy)

Особенность 1: Короткое замыкание (Short-circuit)

Если левый операнд falsy, правый не вычисляется вообще:

function expensiveCheck() {
  console.log('This is expensive!');
  return true;
}

// false && expensiveCheck();
// Вывод: ничего! expensiveCheck никогда не вызовется

// true && expensiveCheck();
// Вывод: 'This is expensive!' — вызовется

// Это очень важно для производительности
let user = null;
user && user.getName(); // getName не вызовется, избежим ошибки

Особенность 2: Возвращаемое значение — не всегда boolean

// && возвращает ЗНАЧЕНИЕ, а не true/false

const result1 = 5 && 10 && 15;
console.log(result1); // 15 (последнее truthy значение)

const result2 = 5 && 0 && 15;
console.log(result2); // 0 (первое falsy значение)

const result3 = null && 'hello';
console.log(result3); // null (первое falsy)

// Это используется для присваивания значений
const user = getUserData() && getUserData().profile;
// Если getUserData() вернёт null, user будет null
// Если вернёт объект, user будет объектом.profile

Особенность 3: Условный рендеринг в React

Часто используется для отображения компонентов:

// ✅ ПРАВИЛЬНО
function Component({ isLoggedIn, user }) {
  return (
    <div>
      {isLoggedIn && <Dashboard user={user} />}
      {!isLoggedIn && <LoginForm />}
    </div>
  );
}

// ❌ ПРОБЛЕМА: 0 и пустая строка покажут "falsy"
const messages = 0;
{messages && <p>{messages} messages</p>} // Покажет: 0 вместо ничего!

// ✅ ПРАВИЛЬНО:
const messages = 0;
{messages > 0 && <p>{messages} messages</p>} // Покажет ничего если messages = 0

Особенность 4: Цепочки логических операций

const user = {
  name: 'John',
  profile: {
    age: 30
  }
};

// Старый способ проверки: много условных операторов
let age;
if (user && user.profile && user.profile.age) {
  age = user.profile.age;
}

// С && (более компактно)
const age = user && user.profile && user.profile.age;

// Современный способ: optional chaining (?.)
const ageModern = user?.profile?.age;

Особенность 5: Присваивание по условию

// Без if/else, используя &&
const enableFeature = () => console.log('Feature enabled');

isAdmin && enableFeature();

// Эквивалентно:
if (isAdmin) {
  enableFeature();
}

Особенность 6: Проблема с 0 и пустыми строками

// ОПАСНО: 0 и пустая строка — это falsy, но иногда нужны

const count = 0;
{count && <p>Count: {count}</p>} // Покажет: 0 (ПРОБЛЕМА!)

// ПРАВИЛЬНО:
{count !== undefined && count !== null && <p>Count: {count}</p>}

// ИЛИ использовать ternary operator
{count > -1 ? <p>Count: {count}</p> : null}

// ИЛИ проверить явно
{typeof count === 'number' && <p>Count: {count}</p>}

Особенность 7: Сравнение с || (OR)

// && вернёт первое falsy ИЛИ последнее значение
5 && 10 && 0 && 15; // 0 (первое falsy)

// || вернёт первое truthy ИЛИ последнее значение
5 || 0 || null || 'hello'; // 5 (первое truthy)
null || undefined || 0 || 'hello'; // 'hello' (первое truthy)

// Комбинация:
const value = defaultValue && computedValue || fallback;
// Если defaultValue truthy И computedValue truthy, return computedValue
// Иначе return fallback

Особенность 8: Nullish coalescing vs &&

// && проверяет truthy/falsy
const a = 0;
const b = a && 'default'; // 'default' (потому что 0 falsy)

// ?? проверяет null/undefined (nullish coalescing)
const c = 0;
const d = c ?? 'default'; // 0 (потому что 0 не null/undefined)

// Важное различие!
const count = 0;
const message1 = count && 'messages'; // 'messages' (НЕПРАВИЛЬНО)
const message2 = count ?? 'messages'; // 0 (ПРАВИЛЬНО)

Особенность 9: Сторона эффектов с &&

// ✅ ПРАВИЛЬНО: используется для условных эффектов
const user = getUser();
user && user.loadProfile(); // Вызовется только если user truthy

// ❌ НЕПРАВИЛЬНО в React: может привести к проблемам
function Component() {
  const [hasData, setHasData] = useState(false);
  
  // Этот паттерн иногда может вызвать проблемы
  hasData && setSomeState(); // ПЛОХАЯ ИДЕЯ!
  
  // ПРАВИЛЬНО:
  useEffect(() => {
    if (hasData) {
      setSomeState();
    }
  }, [hasData]);
}

Практические примеры

Проверка объекта перед использованием:

const user = getUserData();
const userName = user && user.profile && user.profile.name;
// Безопасно, если user null/undefined, будет null

Условное выполнение функции:

const callback = getCallback();
callback && callback(); // Вызовет callback только если он существует

Валидация перед использованием:

const email = getUserEmail();
const isValid = email && email.includes('@');
// Проверит наличие email перед проверкой содержимого

Важные моменты

  1. && возвращает значение, а не boolean (true/false)
  2. Короткое замыкание: если левый falsy, правый не вычисляется
  3. Falsy значения: false, 0, '', null, undefined, NaN
  4. Опасность: 0 и '' — falsy, но иногда нужны (используй условия явно)
  5. Альтернатива: optional chaining (?.), nullish coalescing (??), ternary operator

Заключение

Оператор && — это мощный инструмент для условного выполнения кода и присваивания значений. Но важно помнить, что он возвращает значение, а не boolean, и что falsy значения (0, '', false) могут привести к неожиданным результатам в React. Использование optional chaining (?.) и nullish coalescing (??) в современном JavaScript часто предпочтительнее, так как они дают более явное и понятное поведение.