TGViewer
Frontend | Вопросы собесов Frontend | Вопросы собесов @easy_javascript_ru · 17.6K subscribers
Post #2336 2.95K
🤔 Какие особенности слежения за "глубокими" объектами?

Когда мы отслеживаем изменения в объектах (например, в React, Vue или MobX), важно понимать, что JavaScript не умеет автоматически следить за вложенными свойствами. Это называется глубокое слежение (deep watching).

Проблема: поверхностное слежение (`shallow watching`)

JavaScript сравнивает только ссылки на объекты, а не их содержимое.
const obj = { user: { name: "Иван" } };
const copy = obj;

copy.user.name = "Петр";
console.log(obj.user.name); // "Петр" (оба объекта ссылаются на одно и то же)


🚩Глубокое копирование vs поверхностное

Обычный Object.assign() или spread-оператор ({ ...obj }) делают поверхностное копирование:
const obj = { user: { name: "Иван" } };
const shallowCopy = { ...obj };

shallowCopy.user.name = "Петр";
console.log(obj.user.name); // "Петр" 😱 (изменился оригинал!)


Для глубокого копирования можно использовать structuredClone() или JSON.parse(JSON.stringify(obj)):
const deepCopy = structuredClone(obj);
deepCopy.user.name = "Петр";

console.log(obj.user.name); // "Иван" ✅ (оригинал не изменился)


🚩Как следить за глубокими объектами?

🟠React: следим через `useState` и `useEffect`
В React состояние обновляется только при изменении ссылки (shallow compare).
const [user, setUser] = useState({ name: "Иван" });

useEffect(() => {
console.log("Имя изменилось:", user.name);
}, [user]); // Работает только если user — новый объект!

// НЕ сработает:
user.name = "Петр"; // user остался тем же объектом


Решение – создавать новый объект при изменении:
setUser(prev => ({ ...prev, name: "Петр" }));


🟠Vue: `watch` vs `watchEffect` (глубокое слежение)

Обычный watch следит только за первой вложенностью
watch(user, (newValue) => {
console.log("Изменено:", newValue);
});


Глубокое слежение (deep: true)
watch(user, (newValue) => {
console.log("Изменено:", newValue);
}, { deep: true });


Ставь 👍 и забирай 📚 Базу знаний
  • 👍 11
More from @easy_javascript_ru
  1. Oct 3, 2026🤔 Что известно про шаблонное проектирование, которое ты использовал в разработке? Шаблонн…
  2. Oct 3, 2026🤔 Какие знаешь подходы по написанию css? Существует несколько методологий и подходов к на…
  3. Oct 2, 2026Post #3005
  4. Oct 2, 2026🤔 Какие статические методы promise знаешь? Promise – это объект, представляющий отложенны…
  5. Oct 1, 2026🤔 Как добавить слушатель события? Это важный аспект работы с веб-приложениями, так как по…
  6. Sep 30, 2026🤔 Что такое макро и микро задачи? Макро- и микро-задачи являются частью механизма асинхро…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →