Làm thế nào để bạn so sánh các đối tượng trong javascript?

Như bạn có thể thấy ví dụ trên, cả namefullName đề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ện

JavaScript 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
Nó có nghĩa là gì bằng cách so sánh bằng tài liệu tham khảo của họ?

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, copyNamefullName đang đề cập đến cùng một trường hợp bộ nhớ và do đó trả về true

2️. Các đối tượng có cùng giá trị

Để 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 = {
firstName: "suprabha",
lastName: "supi"
}
let fullName = {
firstName: "suprabha",
lastName: "supi"
}
let copyName = fullNameconsole.log[name === fullName] // false
console.log[copyName == fullName] // true
1 để kiểm tra các giá trị đối tượng

  1. Nút
let name = {
firstName: "suprabha",
lastName: "supi"
}
let fullName = {
firstName: "suprabha",
lastName: "supi"
}
console.log[_.isEqual[name, fullName]]; // true
Tóm tắt ⅀

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 ==, ===

let name = {
firstName: "suprabha",
lastName: "supi"
}
let fullName = {
firstName: "suprabha",
lastName: "supi"
}
let copyName = fullNameconsole.log[name === fullName] // false
console.log[copyName == fullName] // true
4

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

Nguyên thủy có một giá trị trong bộ nhớ

Đ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

Mỗi người có phân bổ bộ nhớ riêng của họ

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

Các biến obj1 và obj2 chứa một tham chiếu. Mỗi đến một vị trí bộ nhớ riêng biệt

Đ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

Cả hai biến đều chứa cùng một thông tin, một tham chiếu đến vị trí của đối tượng

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. ]

Cả hai đều có cùng một tham chiếu đến cùng một đối tượng

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

Bạn có thể sử dụng == để so sánh các đối tượng không?

Toán tử == so sánh xem hai tham chiếu đối tượng có trỏ đến cùng một đối tượng hay không .

Làm cách nào để so sánh hai đối tượng trong JavaScript và nhận được sự khác biệt?

Chúng tôi sẽ lấy hai đối tượng, lặp lại đối tượng đầu tiên bằng cách sử dụng vòng lặp forEach[], kiểm tra sự bằng nhau trong cả hai đối tượng, nếu các giá trị tại bất kỳ điểm nào không khớp, chúng tôi sẽ cập nhật một cờ, thoát khỏi vòng lặp và trả về

Làm cách nào để so sánh hai danh sách đối tượng trong JavaScript?

Để lấy sự khác biệt giữa hai mảng đối tượng. .
Sử dụng phương thức filter[] để lặp lại mảng đầu tiên
Kiểm tra xem mỗi đối tượng không được chứa trong mảng thứ hai
Lặp lại bước 1 và 2 cho mảng thứ hai
Nối các kết quả để có được sự khác biệt hoàn toàn

Làm cách nào để so sánh khóa của hai đối tượng trong JavaScript?

JavaScript. So sánh hai đối tượng để xác định xem đối tượng thứ nhất có chứa các giá trị thuộc tính tương đương với đối tượng thứ hai hay không .
Sử dụng đối tượng. keys[] để lấy tất cả các khóa của đối tượng thứ hai
Sử dụng mảng. nguyên mẫu. mọi [], Đối tượng. nguyên mẫu

Chủ Đề