Như bạn có thể thấy ví dụ trên, cả name
và fullName
đều giống hệt nhau. Tuy nhiên, đối tượng không bằng với ==
hoặc ===
Có hai điều bạn có thể kiểm tra trong khi thực hiện đẳng thức đối tượng
1️⃣ Các đối tượng có cùng thể hiện
2️⃣ Các đối tượng có cùng giá trị
1️. Các đối tượng có cùng thể hiệnJavaScript có hai cách tiếp cận để khớp các giá trị
- Đối với Loại nguyên thủy [chuỗi, số], nó so sánh theo giá trị của chúng
- Đối với Loại không nguyên thủy [đối tượng, mảng, ngày], nó so sánh theo tham chiếu của chúng
So sánh theo tham chiếu có nghĩa là đối tượng đề cập đến cùng một vị trí trong bộ nhớ
ví dụ
let name = {
firstName: "suprabha",
lastName: "supi"
}let fullName = {
firstName: "suprabha",
lastName: "supi"
}let copyName = fullNameconsole.log[name === fullName] // false
console.log[copyName == fullName] // true
Ở đây, copyName
và fullName
đang đề cập đến cùng một trường hợp bộ nhớ và do đó trả về true
Để kiểm tra instance bạn có thể dùng đẳng thức ===
, nhưng để khớp với giá trị thì bạn cần thao tác thêm 😂
let name = {
firstName: "suprabha",
lastName: "supi"
}let fullName = {
firstName: "suprabha",
lastName: "supi"
}function isEqual[obj1, obj2] {
var props1 = Object.getOwnPropertyNames[obj1];
var props2 = Object.getOwnPropertyNames[obj2]; if [props1.length != props2.length] {
return false;
} for [var i = 0; i < props1.length; i++] {
let val1 = obj1[props1[i]];
let val2 = obj2[props1[i]];
let isObjects = isObject[val1] && isObject[val2]; if [isObjects && !isEqual[val1, val2] || !isObjects && val1 !== val2] {
return false;
}
}
return true;
}function isObject[object] {
return object != null && typeof object === 'object';
}console.log[isEqual[name, fullName]]; // true
Có một vài plugin giúp bạn về điều kiện trên, nơi bạn chỉ cần sử dụng
let name = {1 để kiểm tra các giá trị đối tượng
firstName: "suprabha",
lastName: "supi"
}let fullName = {
firstName: "suprabha",
lastName: "supi"
}let copyName = fullNameconsole.log[name === fullName] // false
console.log[copyName == fullName] // true
- Nút
let name = {Tóm tắt ⅀
firstName: "suprabha",
lastName: "supi"
}let fullName = {
firstName: "suprabha",
lastName: "supi"
}console.log[_.isEqual[name, fullName]]; // true
Trong đối tượng, nếu bạn thực hiện kiểm tra đối tượng cho hai đối tượng thì bạn có thể sử dụng ==
, ===
và
let name = {4
firstName: "suprabha",
lastName: "supi"
}let fullName = {
firstName: "suprabha",
lastName: "supi"
}let copyName = fullNameconsole.log[name === fullName] // false
console.log[copyName == fullName] // true
Bởi vì hiểu được điều gì khó khăn hoặc không hiệu quả có thể giúp chúng ta hiểu sâu hơn về lý do tại sao và thường dẫn chúng ta đến việc tìm kiếm hoặc phát triển các giải pháp sẽ hiệu quả. Một liên kết đến một video tuyệt vời ở cuối câu chuyện này
Các loại dữ liệu nguyên thủy so với các loại Tham chiếu [không nguyên thủy]
Về cơ bản, nó liên quan đến JavaScript nguyên thủy so với JavaScript không nguyên thủy [đối tượng]
Như tôi sẽ chứng minh, thông qua mã và phép loại suy, các biến chứa kiểu nguyên thủy được cấp một giá trị **** trong bộ nhớ. Các biến chứa loại không nguyên thủy được cung cấp ** tham chiếu ** trong bộ nhớ
Kiểu nguyên thủy và cấp phát bộ nhớ
ví dụ 1
Các kiểu nguyên thủy, giữ cho nó đơn giản, là số, chuỗi, boolean, không xác định và null. Một danh sách đầy đủ có thể được tìm thấy ở đây
Điều gì đang xảy ra?
Để mượn một phép loại suy phổ biến, giả sử tôi viết số 1 vào một tờ giấy nhớ và đặt nó lên bảng trắng. Đó là để nhắc nhở bản thân rằng tôi có một nhiệm vụ ngày hôm nay. [Tất nhiên tôi có thể viết nhiệm vụ nhưng hãy để nó đơn giản. ]
Đối tác văn phòng của tôi viết số 1 vào một tờ giấy dán để nhắc nhở bản thân rằng anh ấy có cuộc họp lúc mấy giờ và cũng ghi nó lên bảng trắng
Các ghi chú dán khác nhau và mỗi ghi chú chứa giá trị riêng của chúng
Hãy coi mỗi ghi chú dán là bộ nhớ được cấp phát và số là giá trị được lưu trữ trong bộ nhớ được cấp phát. Khi được so sánh, trong trường hợp này, chúng chứa cùng một giá trị, 1
Khi chúng tôi so sánh các nguyên hàm, chúng tôi so sánh các giá trị được lưu trữ trong các vị trí bộ nhớ
Nếu tôi nhận một nhiệm vụ mới và thay đổi ghi chú dán của mình thành 2, thì nó không ảnh hưởng đến ghi chú dán khác. Mỗi người đều có giá trị riêng
ví dụ 2
Biến a được cấp phát bộ nhớ và được gán giá trị là 1. Biến b được cung cấp không gian bộ nhớ riêng và được cung cấp giá trị của biến a, 1. Nó không trỏ đến a, nó độc lập với a và chứa giá trị riêng của nó
Vậy khi thay đổi biến a thì biến b giữ nguyên
Trong JavaScript, mọi nguyên hàm đều có không gian bộ nhớ riêng khi được khai báo. Khi được gán một giá trị, giá trị đó sẽ đi vào không gian bộ nhớ
Loại tham chiếu và cấp phát bộ nhớ
Các kiểu tham chiếu, để đơn giản, là Đối tượng, Hàm và Mảng, được gọi chung là đối tượng. Xem thêm thông tin tại đây
ví dụ 3
Điều quan trọng cần hiểu ở đây là mỗi biến, obj1 và obj2 [có thể là Đối tượng, Mảng hoặc Hàm] chỉ chứa một tham chiếu đến một vị trí trong bộ nhớ. Không phải giá trị của đối tượng
Các vị trí là riêng biệt, vì vậy các tài liệu tham khảo là khác nhau và so sánh không thành công. Chúng tôi không so sánh các giá trị của các đối tượng, mà là các tham chiếu đến các vị trí bộ nhớ của chúng
Vì vậy, đối với các loại tham chiếu JavaScript, chúng tôi nhận được phân bổ trong bộ nhớ khi đối tượng được khai báo, nhưng biến chỉ nhận được tham chiếu đến vị trí của đối tượng trong bộ nhớ chứ không phải giá trị của nó
Quay lại ví dụ về ghi chú dán của chúng tôi
Nếu tôi quyết định tạo một danh sách các nhiệm vụ [không phải nguyên thủy] và đặt nó trên bàn làm việc của mình, tờ giấy dán trên bảng trắng sẽ chứa thông tin cho tôi biết nơi tìm danh sách chứ không phải chính danh sách đó
Ghi chú dán có nội dung như “nhìn trên bàn, góc dưới bên trái. ”
Nếu tôi quyết định tạo một danh sách nhiệm vụ thứ hai và đặt nó trên bàn của mình, một miếng dán khác sẽ được đặt trên bảng trắng cho tôi biết vị trí tìm danh sách thứ hai, “hãy tìm trên bàn, góc dưới cùng bên phải. ]
Nếu tôi so sánh các tin nhắn ghi chú dán trên bảng trắng, chúng không bằng nhau
Vì vậy, ngay cả khi danh sách nhiệm vụ 2 giống với danh sách nhiệm vụ 1 [thứ tự giống hoặc khác nhau], các tham chiếu sẽ khác nhau và chúng sẽ không bằng nhau
Chỉ định các loại tham chiếu
Nếu bạn nhớ lại trong Ví dụ 2, chúng ta đã gán một giá trị nguyên hàm cho biến a. Sau đó chúng ta gán cho biến b giá trị trong biến a
Vì mỗi cái đều có không gian bộ nhớ riêng nên việc thay đổi giá trị của biến a không làm thay đổi giá trị của biến b
Với các loại tham chiếu thì khác
Ví dụ 4
Trong trường hợp này, chúng bằng nhau, vì các biến chứa thông tin giống nhau, cùng tham chiếu đến vị trí của đối tượng trong bộ nhớ
Tương tự với ghi chú dán, nó giống như thể tôi có hai ghi chú dán trên bảng trắng cho tôi biết nơi tìm danh sách ban đầu [trên bàn, góc dưới bên trái. ] Chúng chứa thông tin giống nhau nên bằng nhau
Ví dụ 5
Thay đổi giá trị của obj1 hoặc obj2 sẽ thay đổi giá trị khác vì cả hai đều trỏ đến cùng một đối tượng. [So sánh với Ví dụ 2. ]
Làm thế nào để chúng ta so sánh các đối tượng?
So sánh các đối tượng rất dễ dàng, sử dụng === hoặc Object. Là[]. Hàm này trả về true nếu chúng có cùng tham chiếu và false nếu chúng không
Một lần nữa, tôi xin nhấn mạnh, đó là so sánh các tham chiếu đến các đối tượng, không phải các khóa và giá trị của các đối tượng
Vì vậy, từ Ví dụ 3, Đối tượng. là[obj1,obj2]; . Trong ví dụ 4, đối tượng. là[obj1,obj2];
Vì vậy, ngay cả khi hai đối tượng chứa cùng một dữ liệu, === và Đối tượng. is[] sẽ trả về false, trừ khi các biến chứa tham chiếu đến cùng một đối tượng
So sánh các khóa và giá trị đối tượng phức tạp hơn
Giải pháp có thể đơn giản
Một giải pháp đơn giản có thể là JSON. xâu chuỗi các đối tượng và sau đó so sánh các chuỗi. Điều này hoạt động tốt nếu các phím theo cùng một thứ tự. Điều này không thể được đảm bảo tuy nhiên. Ngoài ra, bạn đang so sánh chuỗi chứ không phải đối tượng
Một ý tưởng khác
Một bước đi đúng hướng là sử dụng Object. keys[] và Object. giá trị[]. Hoặc đối tượng. mục[]
Phần kết luận
Vì vậy, chúng ta đã thấy rằng việc so sánh hai đối tượng không chỉ đơn thuần là nhìn vào các biến. Các biến này chỉ chứa tham chiếu
Việc xác định xem chúng có chứa các giá trị giống nhau hay không có thể là một quá trình phức tạp
Tôi đánh giá cao video youtube này về việc xác định theo chương trình xem hai giá trị đối tượng có bằng nhau hay không