js判斷是否對象自身為空

文章目錄

  • 一、前言
  • 二、`JSON.stringify`
  • 三、`for in` 配合 `hasOwnProperty`
  • 四、`Object.keys`
  • 五、`Object.getOwnPropertyNames`
  • 六、`Object.getOwnPropertyNames` 結合 `Object.getOwnPropertySymbols`
  • 七、`Reflect.ownKeys`
  • 八、最后

一、前言

如何判斷一個對象為空?

先上結論:判斷一個對象是否為空時,使用 Reflect.ownKeys 方法最為完美。

今天我們來聊聊幾種經常使用的方法,以及在不同的場景下我們如何去使用。

二、JSON.stringify

JSON.stringify 方法可以使對象序列化,轉為相應的 JSON 格式。

const obj = {};
console.log(JSON.stringify(obj) === '{}')  // true

缺點:如果存在 undefined、任意的函數以及 symbol 值,在序列化過程中會被忽略(出現在非數組對象的屬性值中時)或者被轉換成 null(出現在數組中時)。

如下示例:

const obj = {a: undefined,b: function() {},c: Symbol()
}
console.log(JSON.stringify(obj) === '{}')  // true

三、for in 配合 hasOwnProperty

使用 for in 對當前對象進行遍歷:

const obj = {}
Object.prototype.a = 1function isEmptyObj(obj) {let flag = truefor (let o in obj) {flag = falsebreak}return flag
}console.log(isEmptyObj(obj))  // false

由于 for in 在進行對象遍歷時,會遍歷對象原型上的屬性,而我們只希望得到其自身的屬性,這時可以使用 hasOwnProperty 來實現,如下:

const obj = {}
Object.prototype.a = 1function isEmptyObj(obj) {let flag = truefor (let o in obj) {if (obj.hasOwnProperty(o)) {flag = falsebreak}}return flag
}console.log(isEmptyObj(obj))  // true

缺點for in 不能遍歷不可枚舉的屬性。

四、Object.keys

Object.keys 會返回對象自身可枚舉屬性組成的數組,而不會遍歷原型上的屬性。

const obj = {}
Object.prototype.a = 1console.log(Object.keys(obj).length === 0)  // true

缺點Object.keysfor in 都只能遍歷可枚舉屬性,不能遍歷不可枚舉的屬性。

我們使用 Object.defineProperty 將屬性 enumerable 設置為 false 來進行測試,示例如下:

const obj = {}
Object.defineProperty(obj, 'a', {value: 1,enumerable: false
})console.log(obj.a)  // 1
console.log(isEmptyObj(obj))  // true
console.log(Object.keys(obj).length === 0)  // true

五、Object.getOwnPropertyNames

使用 Object.getOwnPropertyNames 可以得到對象自身的所有屬性名組成的數組(包括不可枚舉屬性)。

const obj = {}
Object.defineProperty(obj, 'a', {value: 1,enumerable: false
})console.log(Object.getOwnPropertyNames(obj))  // [ 'a' ]

缺點:不能獲取 Symbol 值作為名稱的屬性,以上的 JSON.stringifyfor in 以及 Object.keys 方法也不能獲取Symbol 值作為名稱的屬性,示例如下:

const a = Symbol()
const obj = {[a]: 1
}console.log(obj)  // { [Symbol()]: 1 }
console.log(Object.getOwnPropertyNames(obj).length === 0)  // true
console.log(JSON.stringify(obj) === '{}')  // true
console.log(isEmptyObj(obj))  // true
console.log(Object.keys(obj).length === 0)  // true

六、Object.getOwnPropertyNames 結合 Object.getOwnPropertySymbols

已知 Object.getOwnPropertyNames 唯一的缺點是不能獲取 Symbol 值作為名稱的屬性,而 Object.getOwnPropertySymbols 只能獲取由 Symbol 值作為名稱的屬性,兩者相結合是不是就可以完美解決了。我們來簡單測試一下:

const a = Symbol()
const obj1 = {[a]: 1
}
const obj2 = {b: 2}
const obj3 = {}
Object.defineProperty(obj3, 'a', {value: 1,enumerable: false
})
const obj4 = {}function getLength(obj) {return Object.getOwnPropertyNames(obj).concat(Object.getOwnPropertySymbols(obj)).length
}console.log(getLength(obj1) === 0)  // false
console.log(getLength(obj2) === 0)  // false
console.log(getLength(obj3) === 0)  // false
console.log(getLength(obj4) === 0)  // true

經過測試,上面這種方法的確可以解決,但是比較繁瑣,那有沒有更好的方法呢?答案是有的。

七、Reflect.ownKeys

Reflect.ownKeys 方法返回一個由目標對象自身的屬性組成的數組,它的返回值等同于 Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target)),示例如下:

const a = Symbol()
const obj1 = {[a]: 1
}
const obj2 = {b: 2}
const obj3 = {}
Object.defineProperty(obj3, 'a', {value: 1,enumerable: false
})
const obj4 = {}console.log(Reflect.ownKeys(obj1).length === 0)  // false
console.log(Reflect.ownKeys(obj2).length === 0)  // false
console.log(Reflect.ownKeys(obj3).length === 0)  // false
console.log(Reflect.ownKeys(obj4).length === 0)  // true

八、最后

本人每篇文章都是一字一句碼出來,希望對大家有所幫助,多提提意見。順手來個三連擊,點贊👍收藏💖關注?。一起加油?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211553.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211553.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211553.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySql復習筆記03(小滴課堂) 事務,視圖,觸發器,存儲過程

mysql 必備核心知識之事務的詳細解析: 創建一個數據庫表: 添加數據并開啟事務。 添加數據并查詢。 登錄另一臺服務器發現查不到這個表中的數據。 這是因為事務開啟了,但是沒有提交,只是把數據存到了內存中,還沒有寫入…

以為回調函數是同步的(js的問題)

回調函數可以用來處理 JavaScript 的異步操作,但是選用 Promise、async/await 更好,因為多重回調函數會導致回調地獄。 回調函數不是**同步的**,它是延時操作執行完畢后會被調用的一個函數。 比如全局方法 "setTimeout" &#xf…

CString 的 Replace 函數

Replace 使用測試 CString mSectNameNew L"槽a*b*c*d";CString mSectNameNew2 L"Ca*b*c*d";CString mSectNameNew3 L"[a*b*c*d";mSectNameNew.Replace(_T("M"), _T("C")); // 不會替換mSectNameNew.Re…

JOSEF 沖擊繼電器 ZC-23A DC48V 柜內安裝,板前帶座

系列型號 ZC-23沖擊繼電器;ZC-23A沖擊繼電器; ZC-23B沖擊繼電器 一、用途 沖擊繼電器ZC-23A DC48V 柜內安裝板前帶座 (以下簡稱繼電器),廣泛用于直流操作的繼電器保護及自動控制回路中,作為集中控制信號元件。 二、主要技術參…

C#動態調用C++DLL中的函數

DLL中導出的函數 typedef void (*HQ_MSG_CALLBACK)(void *h, int nMsg, int nMsgType, int nReqNo, const char *szData, int nSize); void SetMsgFunc(void *h, HQ_MSG_CALLBACK pmsgCallBack);C#動態調用上述函數 public delegate void CALLBACK(IntPtr h, int nMsg, int n…

信息處理技術員

目錄 信息處理技術員工作內容 信息處理技術員崗位面試試題舉例 信息處理技術員考試 信息處理技術員工作內容 信息處理技術員是負責處理和管理信息系統的專業人員。他們的主要工作內容包括以下幾個方面: 1.系統維護和管理:信息處理技術員負責維護和管…

大數據股票簡單分析

目錄標題 內容說明解題量化金融的含義量化交易策略 點擊直接資料領取 內容 1解釋量化金融的含義,調研并給出至少 5種量化交易的策略或方法 2.完成Tushare Pro 的安裝、注冊,獲取自己的 Token,查閱網站內的接口講解和示例; 3通過Python 編程完…

力扣刷題總結 字符串(2)【KMP】

🔥博客主頁: A_SHOWY🎥系列專欄:力扣刷題總結錄 數據結構 云計算 數字圖像處理 28.找出字符串中第一個匹配項的下標mid經典KMP4593重復的子字符串mid可以使用滑動窗口或者KMP KMP章節難度較大,需要深入理解其中…

Flink 本地單機/Standalone集群/YARN模式集群搭建

準備工作 本文簡述Flink在Linux中安裝步驟,和示例程序的運行。需要安裝JDK1.8及以上版本。 下載地址:下載Flink的二進制包 點進去后,選擇如下鏈接: 解壓flink-1.10.1-bin-scala_2.12.tgz,我這里解壓到soft目錄 [ro…

OrangePi ZERO2 刷機與啟動

鏡像準備 用讀卡器和Win32Diskimager刷寫鏡像到內存卡,鏡像文件見下面百度云鏈接:https://pan.baidu.com/s/14aKTznc4Jvw4SoFF54JUTg 提取碼:1815 刷寫完畢后插回香橙派 串口登錄 用MobaXterm和USB-TTL進行串口登錄,MobaXterm軟…

談一談網絡協議中的應用層

文章目錄 一,什么是HTTPHTTP的優缺點HTTPS 一,什么是HTTP 我們在通過網絡進行傳輸數據時,我們要保證,我們在發送時構造的數據,在接收時也能夠解析出來,這本質上就是一種協議,是一種應用層協議&…

Spring Cloud + Vue前后端分離-第3章 SpringBoot項目技術整合

Spring Cloud Vue前后端分離-第3章 SpringBoot項目技術整合 3-1 集成持久層框架Mybatis ORM:對象關系映射,Hibernate是全自動ORM,Mybatis是半自動ORM,Mybatis可以操作的花樣更多,是首選的持久層框架 System模塊集成Mybatis框架…

整數分析 C語言xdoj43

問題描述 給出一個整數n&#xff08;0<n<100000000&#xff09;。求出該整數的位數&#xff0c;以及組成該整數的所有數字中的最大數字和最小數字。 輸入說明 輸入一個整數n&#xff08;0<n<100000000&#xff09; 輸出說明 在一行上依次輸出整數n的位…

Linux內核上游提交完整流程及示例

參考博客文章&#xff1a; 向linux內核提交代碼 - 知乎 一、下載Linux內核源碼 通過git下載Linux內核源碼&#xff0c;具體命令如下&#xff1a; git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 實際命令及結果如下&#xff1a; penghaoDin…

IBM Qiskit量子機器學習速成(六)

量子卷積神經網絡 卷積和池化&#xff1a;卷積神經網絡的必備成分 卷積神經網絡被廣泛應用于圖像和音頻的識別當中&#xff0c;關鍵在于“卷積”操作賦予神經網絡統籌學習數據的能力。 執行卷積操作需要輸入數據與卷積核&#xff0c;卷積核首先與輸入數據左上角對齊&#xf…

【數據庫】簡單連接嵌套查詢

目錄 &#x1f387;簡單查詢 &#x1f387;連接查詢 &#x1f387;嵌套查詢 分析&思考 &#x1f387;簡單查詢 --練習簡單查詢 --select * from classes --select * from student --select * from scores --1.按Schedule表的結構要求用SQL語言創建Schedule表 --字段名…

深度學習之全面了解預訓練模型

在本專欄中&#xff0c;我們將討論預訓練模型。有很多模型可供選擇&#xff0c;因此也有很多考慮事項。 這次的專欄與以往稍有不同。我要回答的問題全部源于 MathWorks 社區論壇&#xff08;ww2.mathworks.cn/matlabcentral/&#xff09;的問題。我會首先總結 MATLAB Answers …

關于Linux Kernel Panic導致重啟的簡單分析步驟

Linux系統Kernel Panic的檢索 如何判斷是否發生Kernel Panic&#xff0c;以下以 CentOS 7.9系統為例 #查看 /var/crash 路徑下是否有生成文件夾&#xff0c;Kernel Panic后會生成文件夾在此路徑表示產生了Kernel Panic ls /var/crash #/var/crash/127.0.0.1-2023-12-04-08\:5…

HarmonyOS應用開發者基礎認證考試(穩過)

判斷題 ??????? 1. Web組件對于所有的網頁都可以使用zoom(factor: number)方法進行縮放。錯誤(False) 2. 每一個自定義組件都有自己的生命周期正確(True) 3. 每調用一次router.pushUrl()方法&#xff0c;默認情況下&#xff0c;頁面棧數量會加1&#xff0c;頁面棧支持的…

linux redis-cluster ipv6方式

配置文件&#xff0c;具體字段的含義&#xff0c;可以參考其他文檔。 1.單個文件的配置信息 redis_36380.conf requirepass Paas_2024port 36380tcp-backlog 511timeout 0tcp-keepalive 300daemonize yessupervised nopidfile /data/paas/apps/aicache-redis/redis_36380.p…