Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: useMemo, React, memoization, dependencies, reference equality

Почему передача нового объекта в массив зависимостей useMemo при каждом рендере не даёт эффекта мемоизации?

Вопрос проверяет понимание механизма мемоизации в React и того, как useMemo сравнивает зависимости по ссылке, а не по значению.

Короткий ответ

useMemo сравнивает зависимости с помощью Object.is, то есть по ссылке. Если в массив зависимостей передаётся новый объект, созданный при каждом рендере, его ссылка будет отличаться от предыдущей. React считает, что зависимости изменились, и пересчитывает мемоизированное значение, что сводит на нет эффект мемоизации.

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

Как работает useMemo

Хук useMemo в React принимает функцию-фабрику и массив зависимостей. Он запоминает результат вызова функции и возвращает его при повторных рендерах, пока зависимости не изменятся. Сравнение зависимостей происходит с помощью Object.is, что означает строгое сравнение по ссылке для объектов и массивов.

Проблема с новыми объектами

Если вы передаёте в массив зависимостей объект, созданный прямо в теле компонента, то при каждом рендере создаётся новый объект с новой ссылкой. Например:

const MyComponent = () => {
  const [count, setCount] = useState(0);
  const options = { threshold: 0.5 };
  const memoizedValue = useMemo(() => computeExpensiveValue(options), [options]);
  // ...
};

Здесь options создаётся заново при каждом рендере, поэтому useMemo видит новую ссылку и пересчитывает значение, игнорируя мемоизацию.

Правильное решение

Чтобы мемоизация работала, нужно стабилизировать ссылку на объект. Это можно сделать с помощью useMemo или вынести объект за пределы компонента:

const OPTIONS = { threshold: 0.5 };
const MyComponent = () => {
  const [count, setCount] = useState(0);
  const memoizedValue = useMemo(() => computeExpensiveValue(OPTIONS), [OPTIONS]);
  // ...
};

Или с помощью useMemo для самого объекта:

const options = useMemo(() => ({ threshold: 0.5 }), []);
const memoizedValue = useMemo(() => computeExpensiveValue(options), [options]);

Вывод

Для эффективной мемоизации с useMemo необходимо, чтобы ссылки на объекты в массиве зависимостей оставались стабильными между рендерами. Иначе мемоизация теряет смысл, и вы получаете перерасчёт при каждом рендере.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • React

    React

Ключевые слова

#useMemo

#React

#memoization

#dependencies

#reference equality

Подпишись на React Developer в телеграм

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию