在JS中如何判斷兩個對象是否相等

来源:https://www.cnblogs.com/ronaldo9ph/archive/2023/05/08/17380814.html
-Advertisement-
Play Games

在JavaScript中,判斷兩個對象是否相等有多種方法,取決於你對 相等 的定義以及對象屬性的類型。以下是幾種常見的方法: 1. 嚴格相等運算符 ( ) 使用 運算符可以比較兩個對象是否引用同一個對象。如果兩個變數引用了同一個對象,則它們是相等的,否則它們是不相等的。例如: const obj1 ...


在JavaScript中,判斷兩個對象是否相等有多種方法,取決於你對 相等 的定義以及對象屬性的類型。以下是幾種常見的方法:

 

1. 嚴格相等運算符 (===)

使用 === 運算符可以比較兩個對象是否引用同一個對象。如果兩個變數引用了同一個對象,則它們是相等的,否則它們是不相等的。例如:

const obj1 = { a: 1 };
const obj2 = { a: 1 };
const obj3 = obj1;

console.log(obj1 === obj2); // false
console.log(obj1 === obj3); // true

在上面的例子中, obj1 和 obj2 的屬性值相同,但它們是不同的對象,因此它們的 === 比較返回 false 。而 obj1 和 obj3 引用了同一個對象,它們是相等的,因此 obj1 === obj3 返回 true 。

這裡就是嚴格比較,引用地址和屬性名屬性值都要一一對應。

 

 

 

2. 對象屬性的比較

如果你只是需要比較兩個對象的屬性是否相等(不比較引用地址),你可以使用迴圈或 Object.keys 方法來獲取對象屬性的列表,並比較它們的值。例如:

function isObjectEqual(obj1, obj2) {
  const obj1Keys = Object.keys(obj1);
  const obj2Keys = Object.keys(obj2);

  if (obj1Keys.length !== obj2Keys.length) {
    return false;
  }

  for (let key of obj1Keys) {
    if (obj1[key] !== obj2[key]) {
      return false;
    }
  }

  return true;
}

const obj1 = { a: 1, b: "hello" };
const obj2 = { a: 1, b: "world" };
const obj3 = { a: 1, b: "hello" };

console.log(isObjectEqual(obj1, obj2)); // false
console.log(isObjectEqual(obj1, obj3)); // true

在上面的例子中, isObjectEqual 函數比較了 obj1 和 obj2 的屬性值並返回 false ,因為它們的 b 屬性的值不相等。而 isObjectEqual(obj1, obj3) 返回 true ,因為它們的所有屬性值都相等。

 

 

 

3. 使用 Lodash 等工具庫判斷兩個對象是否相等

可以使用 Lodash 的 isEqual 方法(依然不比較引用地址)。 isEqual 方法會遞歸比較兩個對象的屬性值是否相等,包括嵌套對象和數組。

const obj1 = { a: 1, b: { c: 2 } };
const obj2 = { a: 1, b: { c: 2 } };
const obj3 = { a: 1, b: { c: 3 } };

console.log(_.isEqual(obj1, obj2)); // true
console.log(_.isEqual(obj1, obj3)); // false

在上面的例子中, _.isEqual(obj1, obj2) 返回 true ,因為它們的所有屬性值都相等,包括嵌套的對象。而 _.isEqual(obj1, obj3) 返回 false ,因為它們的 b.c 屬性的值不相等。

 

 

 

4. JSON.stringify 方法

如果你的對象中只包含簡單類型(如數字、字元串、布爾值和 null)以及其他對象或數組,則可以使用 JSON.stringify 方法將對象轉換為字元串,然後比較這些字元串(還是不比較引用地址)。例如:

const obj1 = { a: 1, b: "hello", c: true };
const obj2 = { a: 1, b: "hello", c: true };
const obj3 = { a: 1, b: "world", c: true };

console.log(JSON.stringify(obj1) === JSON.stringify(obj2)); // true
console.log(JSON.stringify(obj1) === JSON.stringify(obj3)); // false

在上面的例子中, JSON.stringify(obj1) 和 JSON.stringify(obj2) 都返回相同的字元串,因此它們的比較返回 true 。而 JSON.stringify(obj1) 和 JSON.stringify(obj3) 返回不同的字元串,因此比較返回 false 。

需要註意的是,這種方法只適用於簡單類型和嵌套對象或數組,因為它無法處理對象中包含函數、正則表達式和 Date 等類型的情況。

 


5. 使用 Object.is() 方法

它與 === 運算符類似,但是有一些特殊情況,例如 Object.is(+0, -0) 返回 false ,而 === 運算符返回 true 。

const obj1 = { a: 1 };
const obj2 = { a: 1 };
const obj3 = obj1;

console.log(Object.is(obj1, obj2)); // false
console.log(Object.is(obj1, obj3)); // true

在上面的例子中, Object.is(obj1, obj2) 返回 false ,因為 obj1 和 obj2 是兩個不同的對象,而 Object.is(obj1, obj3) 返回 true ,因為 obj1 和 obj3 引用了同一個對象。

 


無論你使用哪種方法,都需要明確你對 相等 的定義以及對象屬性的類型,並選擇適合你需求的方法。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Hadoop官方網站 http://hadoop.apache.org/ Hadoop運行模式 本地模式:單機運行,只是用來演示一下官方案例。生產環境不用。 偽分散式模式:也是單機運行,但是具備Hadoop集群的所有功能,一臺伺服器模擬一個分散式的環境。個別缺錢的公司用來測試,生產環境不用。 完全分 ...
  • 主機名 ip ssh免密登陸 #修改主機名 hostnamectl set-hostname node1 #修改ip地址 vim /etc/sysconfig/network-scripts/ifcfg-ens33 #node1 IPADDR="192.168.88.101" NETMASK="22 ...
  • (Oracle常用SQL) 工作中我們基本上每天都要與資料庫打交道,資料庫的知識點呢也特別多,全部記住呢也是不可能的,也沒必要把所有的記住(有些語句命令可能我們一輩子都用不到)。 所以呢在工作之餘,把工作中經常用到的一些語句整理出來,忘記的時候可以當做字典來查。 個人在工作中用Oracle資料庫比較 ...
  • 京東小程式近年來支持了越來越多的業務和應用,做好小程式的摺疊屏的適配也是符合未來的發展趨勢,能為用戶和業務方提供更好的體驗和價值。 ...
  • > 近日來對Kotlin的使用頻率越來越高, 也對自己近年來寫過的Kotlin代碼嘗試進行一個簡單的整理. 翻到了自己五年前第一次使用Kotlin來完成的一個項目([貝塞爾曲線](https://juejin.cn/post/6844903556173004807)), 一時興起, 又用發展到現在的 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 為了讓頁面保活更加穩定,你們是怎麼做的? 我用一行配置實現了 Vue頁面保活是指在用戶離開當前頁面後,可以在返回時恢覆上一次瀏覽頁面的狀態。這種技術可以讓用戶享受更加流暢自然的瀏覽體驗,而不會被繁瑣的操作打擾。 為什麼需要頁面保活? 頁面 ...
  • 現在前端的入門門檻越來越高了,不再是單純 html+css+js,各種前端框架 層出不窮,各種ui組件庫層出不窮。 模塊化,打包化,各種工具庫層出不窮,前端變成大前端 ,甚至前端可以搞定整個項目,通過node作為服務端api, 這裡我們主角就是nodeJs 什麼是nodejs javaScript是 ...
  • 把Socket實例 掛載到全局 為方便梳理,請忽略typescript,一切盡在註釋中 # main.ts import {createApp} from 'vue' import App from './App.vue' import {socket} from "@/xihu/socket" i ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...