用JS判斷對(duì)象是否為空的幾種常用方法
JSON.stringify
JSON.stringify
方法、大家都用過,我相信很多人也用它來判斷一個(gè)js對(duì)象是否是空對(duì)象。
該方法可以序列化對(duì)象并將其轉(zhuǎn)換為相應(yīng)的JSON字符串格式。
比如:
const obj = {}; console.log(JSON.stringify(obj) === '{}') // true
注意:
如果存在未定義屬性值,或函數(shù),Symbol值,在序列化過程中,它們將被忽略或轉(zhuǎn)換為空
請(qǐng)看代碼:
const obj = { a: undefined, b: function() {}, c: Symbol() } console.log(JSON.stringify(obj) === '{}') // true
所以,不是很推薦使用該方法。
hasOwnProperty檢測(cè)
第二種方法呢、就是for in
循環(huán),使用hasOwnProperty
判斷對(duì)象是否有屬性。
為什么需要使用hasOwnProperty
,由于在執(zhí)行對(duì)象遍歷時(shí),也會(huì)遍歷對(duì)象原型上的屬性。
請(qǐng)看代碼:
const obj = {} Object.prototype.a = 1 function isEmptyObj(obj) { let flag = true for (let o in obj) { if (obj.hasOwnProperty(o)) { flag = false break } } return flag } console.log(isEmptyObj(obj)) // true
但是,這種方法,也有一個(gè)問題,for in
不能遍歷非枚舉屬性。具體可以看下面這個(gè)方法的演示。
Object.keys
第三種方法,也是一個(gè)常用的方法,也就是Object.keys
。大家也肯定用過,但是它也是有問題的。
先看一段代碼:
const obj = {} Object.prototype.a = 1 console.log(Object.keys(obj).length === 0) // true
看似沒啥問題,但是Object.keys
只能遍歷可枚舉的屬性,但不能遍歷非枚舉的屬性。
我們使用Object.defineProperty
將enumerable
屬性設(shè)置為false
進(jìn)行測(cè)試。
示例如下:
const obj = {} Object.defineProperty(obj, 'a', { value: 1, enumerable: false }) console.log(obj.a) // 1 console.log(Object.keys(obj).length === 0) // true
所以,與前面的for in
類似,也不推薦使用。
Object.getOwnPropertyNames
既然,都無法獲取非枚舉屬性,那有沒有方法可以獲取呢?
自然是有的。
我們可以使用Object.getOwnPropertyNames
獲取由對(duì)象本身所有屬性名稱(包括非枚舉屬性)組成的數(shù)組。
const obj = {} Object.defineProperty(obj, 'a', { value: 1, enumerable: false }) console.log(Object.getOwnPropertyNames(obj)) // [ 'a' ]
但是這個(gè)方法也有一個(gè)缺點(diǎn)。
Object.getOwnPropertyNames
無法獲取作為名稱屬性的Symbol
值。
請(qǐng)看下面的代碼:
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(Object.keys(obj).length === 0) // true
所以,也不推薦。
Object.getOwnPropertyNames 和 Object.getOwnPropertySymbols
既然Object.getOwnPropertyNames
唯一已知的缺點(diǎn)是無法獲取以Symbol
為名的屬性。
那我們是不是可以進(jìn)一步使用Object.getOwnPropertySymbols
來獲取以Symbol
為名的屬性的方式來結(jié)合一起使用。
小提示:
Object.getOwnPropertySymbols
只能獲取以Symbol
為名的屬性
兩者的結(jié)合是否是完美的解決方案?讓我們做一個(gè)簡(jiǎn)單的測(cè)試:
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
經(jīng)過測(cè)試,上述方法確實(shí)可以解決問題,但比較麻煩。有沒有更好的方法呢?答案是肯定的。
Reflect.ownKeys
最后、再來介紹一個(gè)更簡(jiǎn)單,更靠譜的方法。那就是使用Reflect.ownKeys
;
Reflect.ownKeys
該方法返回一個(gè)由目標(biāo)對(duì)象自身屬性組成的數(shù)組。其返回值等同于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
你學(xué)會(huì)了嗎?學(xué)會(huì)的話、點(diǎn)個(gè)贊吧。
到此這篇關(guān)于用JS判斷對(duì)象是否為空的幾種常用方法的文章就介紹到這了,更多相關(guān)JS判斷對(duì)象是否為空內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js 模仿錨點(diǎn)定位的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猨s 模仿錨點(diǎn)定位的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11前端使用fetch接收流式數(shù)據(jù)處理實(shí)例demo
這篇文章主要介紹了前端使用fetch接收流式數(shù)據(jù)處理的相關(guān)資料,文中描述了一個(gè)流式數(shù)據(jù)處理的demo,需要后端服務(wù)配合進(jìn)行接口調(diào)試,需要的朋友可以參考下2025-02-02利用JavaScript實(shí)現(xiàn)簡(jiǎn)單全選和全不選的思路和方法
最近開始練習(xí)js的基本操作,常常因?yàn)橐恍┬∈韬鰧?dǎo)致頁(yè)面效果無法實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于利用JavaScript實(shí)現(xiàn)簡(jiǎn)單全選和不全選的思路和方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07用原生js統(tǒng)計(jì)文本行數(shù)的簡(jiǎn)單示例
這篇文章我們來看看如何利用原生的JavaScript實(shí)現(xiàn)統(tǒng)計(jì)文本的行數(shù),代碼實(shí)現(xiàn)起來很簡(jiǎn)單,有需要的可以參考借鑒。2016-08-08