2014-10-16 19 views
42

Tôi đang làm việc trên một dự án có cả Angular và Underscore như một phụ thuộc.Tôi có nên sử dụng Angular.copy() hoặc _.clone() không?

Khi tôi cần phải tạo ra một bản sao của một đối tượng, tùy thuộc vào tâm trạng của tôi lúc đó, tôi có thể sử dụng angular.copy() hoặc _.clone()

Nó xảy ra với tôi rằng một trong những phương pháp này có lẽ nhanh hơn/bền/mạnh mẽ Hơn người kia.

Có bất kỳ vấn đề đã biết nào với một trong các chức năng này khiến cho nó tốt hơn hoặc tệ hơn khi sử dụng hơn hàm kia, giả sử cả hai thư viện đã được đưa vào chưa?

+1

bạn có bất cứ kết quả từ so sánh mà bạn đã chạy, có thể với jsperf? hoặc bạn chưa thực hiện nghiên cứu nào. –

+4

hai phương pháp thực hiện rõ ràng hai nhiệm vụ khác nhau, theo tài liệu, (bản sao sâu so với bản sao nông) do đó cách tốt nhất để sử dụng sẽ phụ thuộc vào chính xác bạn muốn làm gì trong mỗi trường hợp. –

+1

Vì vậy, lodash có một phương pháp cloneDeep và cũng có thể nếu bạn vượt qua trong một boolean để phương pháp clone lodash của nó tạo ra một bản sao sâu theo tài liệu.Bất kỳ đề xuất về hiệu suất của những phương pháp so với angular.copy? –

Trả lời

39

Về câu hỏi của bạn: angular.copy và _.clone là khác nhau. Nó không phải là một câu hỏi trong đó là tốt hơn, đó là về những gì bạn cần như @ Kevin B đã nêu trong các ý kiến.

angular.extend(), mặt khác, là một bản sao cạn giống như _.clone

Angular.copy vs Angular.extend

Hiệu suất khôn ngoan, tôi không chắc đó là tốt hơn, nhưng đối với ý kiến ​​của sake, i 'm phản đối việc đưa các thư viện vào phạm vi toàn cầu (gạch dưới) với bất kỳ ứng dụng góc cạnh nào, vì thường những thứ này được viết là angular modules. angular.copy/angular.extend sẽ thắng trong trường hợp này.

nông/sâu Sao chép:

của nó rất đơn giản rằng nếu đối tượng chỉ có lĩnh vực nguyên thủy, thì rõ ràng bạn sẽ đi cho bản sao cạn nhưng nếu đối tượng có tham chiếu đến các đối tượng khác, sau đó dựa trên các requiement, bản sao nông hoặc bản sao sâu nên được chọn. Những gì tôi có ý nghĩa ở đây là, nếu các tài liệu tham khảo không được sửa đổi bất cứ lúc nào, sau đó không có điểm trong đi cho bản sao sâu. Bạn chỉ có thể chọn sao chép nông. Nhưng nếu các tài liệu tham khảo được sửa đổi thường xuyên, sau đó bạn cần phải đi cho bản sao sâu. Một lần nữa không có quy tắc cứng nhắc và nhanh chóng, tất cả đều phụ thuộc vào yêu cầu.

Source

+1

"Nhưng nếu các tài liệu tham khảo được sửa đổi thường xuyên, thì bạn cần phải đi sâu để sao chép." Thay vào đó tôi sẽ nói rằng nếu các tài liệu tham khảo được sửa đổi thì nó có thể là vấn đề cho dù bạn làm sâu hay nông, nhưng nếu không thì nó có thể không quan trọng. Trong thực tế, tôi muốn nói rằng trong trường hợp tài liệu tham khảo được sửa đổi, bạn thường muốn sử dụng bản sao nông hơn. Nhưng như livepo đã nói, bạn cần quyết định từng trường hợp cụ thể. Đối với hiệu suất, như một quy tắc chung nông clone nên được nhanh hơn so với bản sao sâu, đặc biệt là cho các cấu trúc dữ liệu sâu. Đối với các cấu trúc nông, nó có thể phụ thuộc vào thư viện. –

+1

Tôi thường bao gồm dấu gạch dưới dưới dạng dịch vụ trong các ứng dụng cần thực hiện chuyển đổi dữ liệu mở rộng. Điều này ngăn cản bạn phải sử dụng '_' toàn cục. Cách tiếp cận này cũng hoạt động tốt cho các thư viện hữu ích, độc lập khác, ví dụ: momentjs. –

+2

Tôi đặt cược câu trả lời của bạn sẽ khác trong năm 2016. Bạn có thể dễ dàng sử dụng tiêm phụ thuộc (không phải góc cạnh) sử dụng phổ biến hoặc yêu cầu và có quyền truy cập vào gạch dưới hoặc lodash. Lodash được phát hiện nhanh hơn các phương pháp trình duyệt gốc trong một số trường hợp, chẳng hạn như _.forEach trong Chrome. Có thể rất quan trọng trong một ứng dụng dữ liệu quy mô lớn. – bwinchester

3

Chúng tôi đã có một số báo cáo lỗi xác nhận rằng việc sử dụng angular.copy không tạo các đối tượng trống trên một số điện thoại di động Windows. Vì vậy, nếu bạn cần hỗ trợ bất kỳ phiên bản nào của IE trên thiết bị di động, không sử dụng angular.copy! Bị cáo buộc lỗi này đã được cố định bởi microsoft, tuy nhiên chúng tôi đã phải đối phó với nó ...

Trên thực tế, bạn cũng có thể sử dụng Object.assign() ...

Documents: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

ví dụ khác: https://googlechrome.github.io/samples/object-assign-es6/

tôi biết nó nói không có IE, nhưng tôi đã cố gắng nó trên IE11 của tôi và nó hoạt động ...

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