О чём речь
Shallow копирует верхний уровень, вложенные объекты остаются общими. Deep копирует всю вложенность как независимые экземпляры.
Подробности
let obj1 = { a: 1, b: { c: 2 } };
let shallowCopy = { ...obj1 };
shallowCopy.b.c = 3;
console.log(obj1.b.c);
let obj2 = { a: 1, b: { c: 2 } };
let deepCopy = structuredClone(obj2);
deepCopy.b.c = 4;
console.log(obj2.b.c);
Object.assign и spread — shallow. structuredClone — современный deep. JSON.parse(JSON.stringify()) и _.cloneDeep имеют свои ограничения по типам.
Итог
Shallow делит вложенные ссылки; deep делает независимую копию дерева (в рамках алгоритма).