Có gì sai với ví dụ3 và ví dụ4?
Kiểm tra bình đẳng sâu_______0Sự khác biệt duy nhất là ở đây chúng ta đang đi sâu và chỉ so sánh các nguyên thủy
Tại sao tôi nên sử dụng so sánh nông sau đó?Vì vậy, mặc dù có vẻ như so sánh sâu sắc là điều mọi người cần, nhưng thực tế lại khác một chút
Một trường hợp sử dụng như vậy là React Js, React sử dụng hàm nôngCompare[] để tạo các Thành phần thuần túy. ShallowCompare là cách hiệu quả để phát hiện các thay đổi, nó hy vọng bạn không làm thay đổi dữ liệu
Hơn nữa, vì chúng tôi không lặp lại thông qua đứa trẻ, chúng tôi tiết kiệm được rất nhiều thời gian, vì vậy so sánh nông là cách nhanh hơn
Trong JavaScript, các đối tượng luôn được lưu trữ theo tham chiếu. Điều đó có nghĩa là một đối tượng hoàn toàn bằng một đối tượng khác chỉ khi cả hai đều trỏ đến cùng một đối tượng trong bộ nhớ
Tuy nhiên, nếu bạn muốn kiểm tra xem hai POJO có cùng dữ liệu hay không?
Keys và Values Shallow Equal
Một cách tiếp cận đơn giản là lặp qua từng khóa và giá trị trong hai đối tượng và kiểm tra xem các khóa và giá trị có hoàn toàn bằng nhau không
Bình đẳng sâu sắc bằng cách sử dụng JSON.stringify[]
Phần trước cho biết cách so sánh các đối tượng bằng cách kiểm tra xem khóa và giá trị của hai đối tượng có hoàn toàn bằng nhau không. Nhưng nếu một trong các giá trị là một đối tượng thì sao?
Bạn có thể tạo đệ quy objectsEqual[]
, nhưng sau đó bạn cần cẩn thận với đệ quy vô hạn. Một cách dễ dàng để so sánh xem hai POJO có bằng nhau hay không là so sánh các biểu diễn JSON của chúng bằng cách sử dụng JSON.stringify[]
Hàm JSON.stringify[]
đi kèm với một số hạn chế khiến nó trở thành lựa chọn mờ nhạt để kiểm tra đẳng thức sâu. Thứ nhất, thứ tự quan trọng
Thứ hai, không phải tất cả các loại đều có thể biểu diễn trong JSON. Hàm JSON.stringify[]
chuyển đổi ngày thành chuỗi và bỏ qua các khóa có giá trị là undefined
, điều này có thể dẫn đến kết quả đáng ngạc nhiên
Sử dụng isEqual[]
của Lodash
Hàm isEqual[]
của Lodash là cách phức tạp nhất để so sánh hai đối tượng. Nó xử lý nhiều trường hợp khác nhau và tránh được rất nhiều cạm bẫy của hai cách tiếp cận trước đó
Hàm isEqual[]
cũng đủ thông minh để tránh đệ quy vô hạn
Nếu bạn đang sử dụng Lodash, thì isEqual[]
là cách tiếp cận tốt nhất để so sánh xem hai đối tượng có sâu bằng nhau hay không. Phương pháp so sánh nghiêm ngặt nông phù hợp với những trường hợp bạn không lo lắng về các đối tượng lồng nhau và JSON.stringify[]
có thể giúp cung cấp một kiểm tra bình đẳng sâu sơ bộ trong trường hợp bạn không thể sử dụng Lodash. Tuy nhiên, nếu bạn có thể sử dụng Lodash, thì isEqual[]
là cách tiếp cận tốt nhất để kiểm tra xem hai đối tượng có bằng nhau hay không
Rất có thể bạn đã từng nghe những thuật ngữ đó trước đây, nhưng trong trường hợp bạn chưa nghe, hãy tìm hiểu một số quyền về khái niệm
So sánh nông và sâu
Chúng là một kỹ thuật để giải quyết vấn đề so sánh mà Toán tử JavaScript cơ bản không thể tự giải quyết, chẳng hạn như so sánh xem hai đối tượng có bằng nhau về loại dữ liệu, kích thước và giá trị hay không
Và như bạn có thể đoán, chiến lược
┌────────────────────┬─────────┬──────┐
│ │ Shallow │ Deep │
├────────────────────┼─────────┼──────┤
│ Fast Performance │ ✔ │ ✖ │
│ Order Matter │ ✖ │ ✔ │
│ Reference Equality │ ✔ │ ✖ │
│ Strict │ ✔ │ ✔ │
└────────────────────┴─────────┴──────┘
4 so sánh bề ngoài sự bằng nhau của 2 toán hạng — chỉ ở cấp độ sâu thứ nhất— trong khi chiến lược ┌────────────────────┬─────────┬──────┐
│ │ Shallow │ Deep │
├────────────────────┼─────────┼──────┤
│ Fast Performance │ ✔ │ ✖ │
│ Order Matter │ ✖ │ ✔ │
│ Reference Equality │ ✔ │ ✖ │
│ Strict │ ✔ │ ✔ │
└────────────────────┴─────────┴──────┘
5 so sánh sự bằng nhau từ tất cả các cấp độ sâuVì vậy, cái nào tôi nên chọn?
Chà, nó phụ thuộc vào trường hợp sử dụng của bạn. Điều quan trọng nhất là bạn phải thực sự hiểu vấn đề mà bạn đang giải quyết bằng mã của mình và sự đánh đổi của từng phương pháp
Nói về sự đánh đổi
Hãy liệt kê một số ưu và nhược điểm của từng phương pháp
┌────────────────────┬─────────┬──────┐
│ │ Shallow │ Deep │
├────────────────────┼─────────┼──────┤
│ Fast Performance │ ✔ │ ✖ │
│ Order Matter │ ✖ │ ✔ │
│ Reference Equality │ ✔ │ ✖ │
│ Strict │ ✔ │ ✔ │
└────────────────────┴─────────┴──────┘
phụ thuộc
Chúng tôi sẽ sử dụng phiên bản cải tiến của toán tử JavaScript
┌────────────────────┬─────────┬──────┐
│ │ Shallow │ Deep │
├────────────────────┼─────────┼──────┤
│ Fast Performance │ ✔ │ ✖ │
│ Order Matter │ ✖ │ ✔ │
│ Reference Equality │ ✔ │ ✖ │
│ Strict │ ✔ │ ✔ │
└────────────────────┴─────────┴──────┘
6 mà chúng tôi đã trình bày ở đây trước đây, nếu bạn chưa đọc nó, hãy nhấp vào liên kết bên dưới và xem thử