2 loại copy: Shallow (nghĩa) và Deep (sâu).
Shallow Copy
Copy cấp 1 (top-level). Object lồng nhau **chia sẻ reference**.
let inner = { a: 'b', c: 'd' };
let obj = { x: "test", y: inner };
let copy = Object.assign({}, obj); // hoặc {...obj}
inner.a = "test";
console.log(obj); // { x: 'test', y: { a: 'test', c: 'd' } }
console.log(copy); // { x: 'test', y: { a: 'test', c: 'd' } } — MUTATED!
Deep Copy
Clone đệ quy mọi cấp độ — hoàn toàn độc lập.
Cách 1: JSON round-trip (đơn giản, nhưng hạn chế)
let copy = JSON.parse(JSON.stringify(obj)); // Mất: function, Date, RegExp, Map, Set, Symbol, undefined, circular ref
Cách 2: structuredClone() (Native, modern — khuyên dùng)
let copy = structuredClone(obj); // Hỗ trợ: Date, RegExp, Map, Set, ArrayBuffer, circular reference!
Cách 3: Lodash _.cloneDeep()
const _ = require('lodash');
let copy = _.cloneDeep(obj);
So sánh
| Method | Deep? | Function | Date/RegExp | Circular | Support |
|---|---|---|---|---|---|
| Object.assign / {...} | No | ✓ | ✓ | ✗ | All |
| JSON.parse/stringify | Yes | ✗ | ✗ (string) | ✗ | All |
| structuredClone() | Yes | ✗ | ✓ | ✓ | Modern |
| lodash.cloneDeep | Yes | ✓ | ✓ | ✓ | All (lib) |