2017-01-25 15 views
6

Tôi muốn biết là có một sự khác biệt giữaSự khác biệt giữa Object.assign và JSON.parse (JSON.stringify (obj)) cho nhân bản sâu của một đối tượng là gì?

Object.assign({}, obj) 

JSON.parse(JSON.stringify(obj)) 

cho nhân bản sâu sắc về một đối tượng? Bất cứ ai có thể giải thích nếu họ có bất kỳ ý tưởng?

+0

'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) –

+0

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

+0

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". –

Trả lời

12

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 
0

Tôi nghĩ kết quả là như nhau, nhưng có sự khác biệt trong kiểm tra hiệu suất, object.assign nhanh hơn nhiều so với JSON.parse (JSON.stringify (obj)).

Vì vậy, nếu bạn quan tâm đến việc thực hiện nó là tốt hơn để sử dụng object.assign

kiểm tra các liên kết dưới đây:

enter link description here

Các vấn đề liên quan