Проверяет понимание того, почему мемоизация в React опирается на ссылочное равенство аргументов и как это влияет на производительность.
Мемоизация в React строится на идее: если входные данные не изменились, не нужно пересчитывать результат или перерисовывать компонент. Но как понять, что данные «не изменились»? React использует поверхностное сравнение (shallow compare), где для объектов и функций проверяется ссылка, а не глубокое содержимое. Это компромисс между скоростью и точностью.
Глубокое сравнение объектов может быть дорогим: нужно рекурсивно обойти все поля, учесть циклические ссылки, функции, символы. На каждом рендере это убило бы производительность. Сравнение по ссылке — это операция O(1): достаточно проверить, указывают ли две переменные на один и тот же участок памяти.
Если вы передаёте в React.memo компонент и объект создаётся внутри родителя при каждом рендере, ссылка меняется — мемоизация бесполезна.
// Плохо: объект создаётся заново каждый рендер
function Parent() {
return <Child config={{ theme: 'dark' }} />;
}
// Хорошо: ссылка стабильна
const CONFIG = { theme: 'dark' };
function Parent() {
return <Child config={CONFIG} />;
}
// Или через useMemo
function Parent({ theme }) {
const config = useMemo(() => ({ theme }), [theme]);
return <Child config={config} />;
}React.memo — сравнивает пропсы по ссылке.useMemo и useCallback — кэшируют значения и функции, сохраняя ссылку между рендерами.useEffect — зависимости сравниваются по ссылке, поэтому объекты в массиве зависимостей часто приводят к лишним вызовам.Итог: сравнение по ссылке — быстрый и предсказуемый механизм, который делает мемоизацию эффективной, но требует от разработчика следить за стабильностью ссылок на объекты и функции.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию