JavaScript sâu
Trong thời gian dài nhất, bạn phải dùng đến các giải pháp thay thế và thư viện để tạo bản sao sâu của giá trị JavaScript. Nền tảng hiện được cung cấp với Show Hỗ trợ trình duyệt chrome 98, Được hỗ trợ 98 firefox 94, Được hỗ trợ 94 edge 98, Supported 98 safari 15.4, Supported 15. 4 Bản sao nôngSao chép một giá trị trong JavaScript hầu như luôn nông, trái ngược với sâu. Điều đó có nghĩa là những thay đổi đối với các giá trị được lồng sâu sẽ hiển thị trong bản sao cũng như bản gốc Một cách để tạo một bản sao nông trong JavaScript bằng cách sử dụng toán tử trải rộng đối tượng
Việc thêm hoặc thay đổi thuộc tính trực tiếp trên bản sao nông sẽ chỉ ảnh hưởng đến bản sao, không ảnh hưởng đến bản gốc
Tuy nhiên, việc thêm hoặc thay đổi một thuộc tính được lồng sâu sẽ ảnh hưởng đến cả bản sao và bản gốc
Biểu thức
Các giá trị không nguyên thủy được xử lý dưới dạng tham chiếu, nghĩa là hành động sao chép giá trị thực sự chỉ là sao chép một tham chiếu đến cùng một đối tượng cơ bản, dẫn đến hành vi sao chép nông Bản sao sâuNgược lại với một bản sao nông là một bản sao sâu. Thuật toán sao chép sâu cũng sao chép từng thuộc tính của một đối tượng, nhưng tự gọi nó một cách đệ quy khi nó tìm thấy một tham chiếu đến một đối tượng khác, đồng thời tạo ra một bản sao của đối tượng đó. Điều này có thể rất quan trọng để đảm bảo rằng hai đoạn mã không vô tình chia sẻ một đối tượng và vô tình thao túng trạng thái của nhau Đã từng không có cách dễ dàng hay hay ho nào để tạo bản sao sâu của một giá trị trong JavaScript. Nhiều người dựa vào các thư viện của bên thứ ba như chức năng. Có thể cho rằng giải pháp phổ biến nhất cho vấn đề này là hack dựa trên JSON
Trên thực tế, đây là một cách giải quyết phổ biến, đó là 0 và cụ thể là mẫu ở trên để làm cho nó nhanh nhất có thể. Và trong khi nó nhanh, nó đi kèm với một số thiếu sót và vấp ngã
nhân bản có cấu trúcNền tảng đã cần khả năng tạo các bản sao sâu của các giá trị JavaScript ở một vài nơi. Lưu trữ một giá trị JS trong IndexedDB yêu cầu một số hình thức tuần tự hóa để nó có thể được lưu trữ trên đĩa và sau đó được giải tuần tự hóa để khôi phục giá trị JS. Tương tự, việc gửi tin nhắn đến một WebWorker qua 9 yêu cầu chuyển một giá trị JS từ một lĩnh vực JS này sang một lĩnh vực JS khác. Thuật toán được sử dụng cho việc này được gọi là "Bản sao có cấu trúc" và cho đến gần đây, các nhà phát triển không dễ dàng truy cập đượcĐiều đó bây giờ đã thay đổi. Thông số kỹ thuật HTML đã được sửa đổi để hiển thị một chức năng có tên là
Đó là nó. Đó là toàn bộ API. Nếu bạn muốn đi sâu hơn vào chi tiết, hãy xem bài viết MDN Các tính năng và hạn chếNhân bản có cấu trúc giải quyết nhiều thiếu sót (mặc dù không phải tất cả) của kỹ thuật 1. Nhân bản có cấu trúc có thể xử lý các cấu trúc dữ liệu theo chu kỳ, hỗ trợ nhiều loại dữ liệu tích hợp và thường mạnh mẽ hơn và thường nhanh hơnTuy nhiên, nó vẫn có một số hạn chế có thể khiến bạn mất cảnh giác
Nếu bất kỳ hạn chế nào trong số này là yếu tố gây khó khăn cho trường hợp sử dụng của bạn, thì các thư viện như Lodash vẫn cung cấp các triển khai tùy chỉnh của các thuật toán nhân bản sâu khác có thể phù hợp hoặc không phù hợp với trường hợp sử dụng của bạn Hiệu suấtMặc dù tôi chưa thực hiện so sánh điểm chuẩn vi mô mới, nhưng tôi đã thực hiện so sánh vào đầu năm 2018, trước khi 0 là lựa chọn nhanh nhất cho các đối tượng rất nhỏ. Tôi hy vọng điều đó sẽ vẫn như cũ. Các kỹ thuật dựa trên nhân bản có cấu trúc nhanh hơn (đáng kể) đối với các đối tượng lớn hơn. Xem xét rằng structuredClone() mới không có chi phí lạm dụng các API khác và mạnh mẽ hơn 0, tôi khuyên bạn nên đặt nó làm phương pháp mặc định để tạo các bản sao sâuPhần kết luậnNếu bạn cần tạo một bản sao sâu của một giá trị trong JS—có thể đó là do bạn sử dụng cấu trúc dữ liệu bất biến hoặc bạn muốn đảm bảo rằng một hàm có thể thao tác với một đối tượng mà không ảnh hưởng đến đối tượng gốc—bạn không còn cần tìm đến các giải pháp thay thế hoặc . Hệ sinh thái JS hiện có JavaScript sâu là gì?Bản sao sâu có nghĩa là tất cả các giá trị của biến mới được sao chép và ngắt kết nối khỏi biến ban đầu . Một bản sao nông có nghĩa là các giá trị (phụ) nhất định vẫn được kết nối với biến ban đầu. Để thực sự hiểu về sao chép, bạn phải tìm hiểu cách JavaScript lưu trữ các giá trị.
Bản sao sâu JavaScript là gì?Bản sao sâu của đối tượng là bản sao có thuộc tính không chia sẻ cùng tham chiếu (trỏ đến cùng giá trị cơ bản) như thuộc tính của đối tượng nguồn mà từ đó bản sao được tạo ra . .
Làm cách nào để sao chép một đối tượng JavaScript?Để sao chép một đối tượng trong JavaScript, bạn có ba tùy chọn. . Sử dụng mức chênh lệch (. ) cú pháp Sử dụng đối tượng. phương thức gán() Sử dụng JSON. stringify() và JSON. phương pháp phân tích () |