2015-12-29 16 views
15

Tôi vừa bắt gặp khái niệm này củaJS: Liệu Object.assign() tạo ra bản sao sâu hoặc bản sao cạn

var copy = Object.assign({}, originalObject); 

mà tạo ra một bản sao của đối tượng ban đầu vào đối tượng "copy". Tuy nhiên, câu hỏi của tôi là, theo cách này, đối tượng nhân bản có tạo ra một bản sao sâu hoặc bản sao nông không?

PS: Sự nhầm lẫn là, nếu nó tạo ra một bản sao sâu, thì đó sẽ là cách dễ nhất để sao chép một đối tượng.

+0

doc là tự giải thích tôi đoán: "The() phương pháp Object.assign được sử dụng để sao chép các giá trị của tất cả các thuộc tính ** riêng đếm ** từ một hoặc nhiều đối tượng nguồn cho một đối tượng mục tiêu" – Sebas

Trả lời

18

Hãy quên đi bản sao sâu, thậm chí bản sao nông không an toàn, nếu đối tượng bạn đang sao chép có thuộc tính với thuộc tính enumerable được đặt thành false.

MDN:

Các Object.assign() phương pháp duy nhất bản tính đếm được và riêng từ một đối tượng nguồn cho một đối tượng mục tiêu

lấy ví dụ này

var o = {}; 

Object.defineProperty(o,'x',{enumerable: false,value : 15}); 

var ob={}; 
Object.assign(ob,o); 

console.log(o.x); // 15 
console.log(ob.x); // undefined 
11

Bằng cách sử dụng Object.assign(), bạn thực sự đang thực hiện Shallow Copy đối tượng của bạn. Bất cứ khi nào chúng ta thực hiện một phép toán như gán một đối tượng cho đối tượng khác, chúng ta thực sự thực hiện một bản sao nông, tức là nếu OBJ1 là một đối tượng, sửa đổi nó thông qua một đối tượng khác là OBJ2 cũng sẽ phản ánh các thay đổi trong OBJ1.

+15

nếu nó chỉ tạo ra một bản sao nông, Redux hoạt động như thế nào? Tôi nghĩ toàn bộ vấn đề của nó là tạo một bản sao sâu của dữ liệu được gửi đi để nếu dữ liệu được thay đổi bên ngoài cửa hàng, nó sẽ không thay đổi những gì trong cửa hàng. nếu đó là một bản sao nông, thì dữ liệu sẽ được liên kết, gây ra vấn đề với dữ liệu thay đổi những gì trong cửa hàng ngay cả khi không có công văn, đúng không? – stackjlei

+0

Tôi đã gặp phải vấn đề tương tự trong Redux và tôi đã kết thúc với JSON.parse (JSON.stringify()). Điều này cũng có vấn đề nếu đối tượng bị đột biến bởi gói khác và tạo ra các vấn đề đệ quy. Tôi đang tìm kiếm một giải pháp thay thế tốt hơn. Phương pháp này vẫn là phương pháp tôi đang sử dụng. – Stu

3

Nó tạo ra một bản sao cạn, theo this paragraph from MDN:

Đối với nhân bản sâu sắc, chúng ta cần phải sử dụng lựa chọn thay thế khác vì Object.assign() bản giá trị tài sản. Nếu giá trị nguồn là một tham chiếu đối tượng, nó chỉ sao chép giá trị tham chiếu đó.

Vì mục đích của Redux, Object.assign() là đủ vì trạng thái của ứng dụng Redux chỉ chứa giá trị bất biến (JSON).

+4

Trạng thái Redux của ứng dụng có thể chứa các đối tượng có tham chiếu đến các đối tượng khác không ..? –

0

Đối với số Data structures tôi thấy rằng JSON.stringify()JSON.parse() hoạt động tốt.

// store as JSON 
var copyOfWindowLocation = JSON.stringify(window.location) 
console.log("JSON structure - copy:", copyOfWindowLocation) 
// convert back to Javascript Object 
copyOfWindowLocation = JSON.parse(copyOfWindowLocation) 
console.log("Javascript structure - copy:", copyOfWindowLocation) 
Các vấn đề liên quan