Sự khác biệt là
Object.assign({}, obj)
tạo ra một shallow copy, không phải deep, trong khi
JSON.parse(JSON.stringify(obj))
serializes đối tượng dưới dạng chuỗi JSON và sau đó deserializes nó, có hiệu quả tạo ra một bản sao sâu.
Bản sao nông chỉ là tốt, nếu tất cả các thuộc tính của bạn trỏ đến giá trị nguyên thủy hoặc nếu bạn không có ý định đột biến các đối tượng được tham chiếu bởi bản sao. Nếu bạn làm thế, những thay đổi sẽ được hiển thị trong cả hai bản gốc và bản sao cạn, vì cả hai đều tham khảo cùng một đối tượng:
> let a = { k: { h: 1 } };
> let b = Object.assign({}, a);
> b.k.h = 2;
> a
{ k: { h: 2 } }
> b
{ k: { h: 2 } }
Bạn dĩ nhiên có thể biến những bản sao của chính nó mà không có nó có bất kỳ ảnh hưởng đến bản gốc:
> b.j = 4
> b.k = { new: 'object' }
> a
{ k: { h: 2 } }
> b
{ k: { new: 'object' }, j: 4 }
Bí quyết serialize-deserialize mặt khác tạo ra một bản sao sâu nơi mà mọi thứ được tạo ra từ đầu:
> let c = JSON.parse(JSON.stringify(b));
> c
{ k: { h: 2 } }
> c.k.h = 3
> c
{ k: { h: 3 } }
> a
{ k: { h: 2 } }
> b
{ k: { h: 2 } }
một cách khác để kiểm tra id các thực thể đang sử dụng sự bình đẳng nghiêm ngặt:
> let a = { k: { h: 1 } };
> let b = Object.assign({}, a);
> a.k === b.k // both point to the same object
true
> let c = JSON.parse(JSON.stringify(b));
> c.k === b.k // different objects
false
Nguồn
2017-01-25 10:00:50
'Object giá trị của tất cả các thuộc tính riêng có thể đếm được từ một hoặc nhiều đối tượng nguồn đến một đối tượng đích."] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) –
Tại đây trong bảng điều khiển chrome var obj1 = {"d": 22, "k": 33} var obj2 = Object.assign ({}, obj1) obj2 Object {d: 22, k: 33} obj2.k = 44 obj1 Object {d: 22, k: 33} ... Dưới đây obj1 làm không thay đổi vì vậy nó có nghĩa là nó là bản sao sâu phải không? – Ram
Không, nó là một bản sao nông. Bạn đang biến đổi các thuộc tính của bản sao. Hãy thử tạo một đối tượng của các đối tượng, tạo một bản sao và sau đó tắt các đối tượng "được trỏ tới". –