判断JavaScript对象是否为空,最佳方法与性能对比

引言:在日常开发中,你是否经常需要判断一个对象是否为空?你知道有哪些高效的方法可以做到这一点吗?今天,我们不仅要探讨这些方法,还要通过性能对比找出最优解。快来看看,你平常用的方法是最佳选择吗?

在这里插入图片描述

想象一下,你正在优化一个关键逻辑的性能,却发现对象判空操作成了瓶颈。如何选择既高效又简洁的对象判空方法,成为了面临的难题。如果你也曾面临这样的问题,本文将为你提供答案。希望文章对你有所帮助,有所借鉴!

目录

  1. 使用Object.keys()方法
  2. 使用JSON.stringify()方法
  3. 使用for...in循环
  4. 使用Object.getOwnPropertyNames()方法
  5. 使用Reflect.ownKeys()方法
  6. 使用Object.entries()方法
  7. 其他判断方法
    • 使用lodash库的isEmpty()方法
    • 使用Underscore库的isEmpty()方法
  8. 性能对比
  9. 总结

1. 使用Object.keys()方法(重点推荐)

function isEmpty(obj) {return Object.keys(obj).length === 0;
}const obj = {};
console.log(isEmpty(obj)); // true

Object.keys() 是相对快速的方法,因为它直接返回一个包含所有自有属性的数组,且不包括原型链上的属性。适用于大部分常见对象的快速判空操作。

2. 使用JSON.stringify()方法

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

JSON.stringify()将对象转换成字符串。它可能比其他方法慢一些,并且不适用于包含不可序列化属性的对象。适用于简单对象的判空,但不推荐在性能要求高的场景中使用。

3. 使用for...in循环

function isEmpty(obj) {for (let key in obj) {if (obj.hasOwnProperty(key)) {return false;}}return true;
}const obj = {};
console.log(isEmpty(obj)); // true

for...in循环遍历对象的所有属性,包括原型链上的可枚举属性。需要在循环中加入hasOwnProperty检查以避免误判。虽然性能不一定总是较差,但在某些情况下,它的性能可能优于其他方法。适用于需要兼容老旧环境的场景。

4. 使用Object.getOwnPropertyNames()方法

function isEmpty(obj) {return Object.getOwnPropertyNames(obj).length === 0;
}const obj = {};
console.log(isEmpty(obj)); // true

这个方法返回一个包含所有自有属性的数组,不包括原型链上的属性,适用于检查对象的所有属性,包括不可枚举的。

5. 使用Reflect.ownKeys()方法

function isEmpty(obj) {return Reflect.ownKeys(obj).length === 0;
}const obj = {};
console.log(isEmpty(obj)); // true

Reflect.ownKeys()提供了最全面的属性列表,包括符号属性和不可枚举的属性,但不包括原型链上的属性。较新的方法,可能不兼容老旧浏览器。适用于需要全面检查对象所有属性的场景。

6. 使用Object.entries()方法

function isEmpty(obj) {return Object.entries(obj).length === 0;
}const obj = {};
console.log(isEmpty(obj)); // true

性能与Object.keys()类似,但信息量更大。返回一个对象的键值对数组。适用于需要同时获取键和值信息的场景。

其他判断方法

使用lodash库的isEmpty()方法

const _ = require('lodash');function isEmpty(obj) {return _.isEmpty(obj);
}const obj = {};
console.log(isEmpty(obj)); // true

功能强大,支持多种数据类型。但是需要额外引入库,增加包体积。适用于项目中已经使用lodash的场景。

使用Underscore库的isEmpty()方法

const _ = require('underscore');function isEmpty(obj) {return _.isEmpty(obj);
}const obj = {};
console.log(isEmpty(obj)); // true

类似于lodash,功能强大。也是需要额外引入库,增加包体积。适用于项目中已经使用Underscore的场景。

对于库如lodash和Underscore的使用,虽然它们提供了方便的工具函数,但在一些追求轻量级和性能的场景中,可能会选择不引入这些库,以减少依赖和包体积。

性能对比

为了更好地理解这些方法的性能差异,下面进行一个简单的性能测试。假设我们有一个包含 1000 个属性的对象,分别使用上述方法来判断它是否为空。

const largeObj = {};
for (let i = 0; i < 1000; i++) {largeObj[i] = i;
}console.time('Object.keys');
isEmptyWithKeys(largeObj);
console.timeEnd('Object.keys');console.time('JSON.stringify');
isEmptyWithJSONStringify(largeObj);
console.timeEnd('JSON.stringify');console.time('for...in');
isEmptyWithForIn(largeObj);
console.timeEnd('for...in');console.time('Object.getOwnPropertyNames');
isEmptyWithGetOwnPropertyNames(largeObj);
console.timeEnd('Object.getOwnPropertyNames');console.time('Reflect.ownKeys');
isEmptyWithReflectOwnKeys(largeObj);
console.timeEnd('Reflect.ownKeys');console.time('Object.entries');
isEmptyWithEntries(largeObj);
console.timeEnd('Object.entries');function isEmptyWithKeys(obj) {return Object.keys(obj).length === 0;
}function isEmptyWithJSONStringify(obj) {return JSON.stringify(obj) === '{}';
}function isEmptyWithForIn(obj) {for (let key in obj) {if (obj.hasOwnProperty(key)) {return false;}}return true;
}function isEmptyWithGetOwnPropertyNames(obj) {return Object.getOwnPropertyNames(obj).length === 0;
}function isEmptyWithReflectOwnKeys(obj) {return Reflect.ownKeys(obj).length === 0;
}function isEmptyWithEntries(obj) {return Object.entries(obj).length === 0;
}

运行结果示例(以毫秒为单位):

  • Object.keys: 0.44ms
  • JSON.stringify: 1.12ms
  • for...in: 0.79ms
  • Object.getOwnPropertyNames: 0.72ms
  • Reflect.ownKeys: 0.91ms
  • Object.entries: 0.65ms

从测试结果可以看出,Object.keys() 是最快的方法,适合在性能要求较高的场景中使用。而 JSON.stringify() 性能较差,不建议用于大对象的判空操作。

总结

在实际应用中,如果你的对象很大,或者你正在进行性能关键的操作,使用 Object.keys()Object.getOwnPropertyNames() 可能会更合适,因为它们直接返回属性列表而不需要额外的遍历或字符串转换。

如果你需要兼容老旧环境,for...in 循环仍然是一个可靠的方法,只需确保使用 hasOwnProperty 检查以避免误判。

在这里插入图片描述

你最常用哪种方法判断对象是否为空?欢迎在评论区一起讨论下!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/21650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux安装gpu驱动

安装rpm包 进入官网 &#xff0c;选择机器的配置和环境。 下载完rpm之后&#xff0c;运行下面的命令。 i) sudo rpm -i nvidia-driver-local-repo-rhel8-550.54.15-1.0-1.x86_64.rpm ii) sudo dnf clean all iii) sudo dnf -y module install nvidia-driver:latest-dkms 安…

2024/5/30

In recent weeks, Target and Aldi have broadcast price cuts on thousands of items, while Walmart unveiled a new private label lineup of quality “chef-inspired food” mostly in the $5-and-under range. The shift comes as U.S. consumers have been signaling th…

煤矿塌陷位移监测站-全天候监测

TH-WY1煤矿塌陷位移监测站&#xff0c;作为矿山安全监测系统的重要组成部分&#xff0c;其设计、构建和功能均针对煤矿塌陷等地质灾害的实时监测与预警。 煤矿塌陷位移监测站&#xff0c;简称位移监测站&#xff0c;是一种利用先进传感器和仪器设备&#xff0c;对煤矿及周边区…

QML信号连接到c++的槽函数(五)

文章目录 前言一、QML Signal and Handler Event System二、QML信号连接到c++的槽函数代码实例1. 创建一个QML 工程2. 用C++ 实现一个QML Types3. 代码实例4. 运行结果总结参考资料前言 本文主要介绍,如何将QML 中的信号连接到C++ 中的槽函数 软硬件环境: 硬件:PC 软件:wi…

以hive metastore报错举例,远程调试hadoop服务

项目场景&#xff1a; CDH集群CM切换hive元数据库报错&#xff1a; com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at…

步进电机噪音大?抖动厉害?-TMC4361步进闭环方案轻松解决

步进电机的闭环控制&#xff0c;实现与伺服电机功能媲美及超越的特点。在电机控制过程中如果想要高效、更高精度以及绝对的可靠性&#xff0c;我们为您推荐在无传感器及将体积做到最小的更高性价比的驱动方案。 我们都知道&#xff0c;在步进电机无反馈时&#xff0c;电机的高…

【刷题(16)】子串

一 子串基础 二 和位K的子数组 1 题目 2 解题思路 前缀和哈希&#xff08;两数之和&#xff09; 假如存在区间[left,right]&#xff0c;使得在[left,right]这个区间的子数组的和为k。换句话说&#xff0c;就是前right项和减去前left-1项和等于k&#xff0c;即前left-1项和等…

【机器学习】——驱动智能制造的青春力量,优化生产、预见故障、提升质量

目录 一.优化生产流程 1.1 数据收集 1.2 数据预处理 1.3 模型训练 1.4 优化建议 1.5 示例代码 二.预测设备故障 2.1 数据收集 2.2 数据预处理 2.3 模型训练 2.4 故障预测 2.5 示例代码 三.提升产品质量 3.1 数据收集 3.2 数据预处理 3.3 模型训练 3.4 质量提升…

07C回调函数

C零碎语法 目录 文章目录 C零碎语法流程1.声明一个函数指针2.定义回调函数3.注册回调函数 应用4.事件回调5.同步回调函数6.异步回调函数 流程 1.声明一个函数指针 uint8_t (*p_CallbackFunc)(void);2.定义回调函数 重要的是要注意回调函数只是一个函数。 由于它的使用方式(…

leetCode.90. 子集 II

leetCode.90. 子集 II 题目思路 代码 class Solution { public:vector<vector<int>> res;vector<int> path;vector<vector<int>> subsetsWithDup(vector<int>& nums) {// 先排序&#xff0c;让有相同元素的都放到一起sort(nums.begi…

msconfig修改引导导致电脑无法进入系统 和 启动蓝屏问题

目录 解决方法遇到的问题开机蓝屏进入【指定UFEI固件设置】进入bios启动系统选择界面&#xff08;忘了拍照&#xff09; 解决方法 找到一个移动U盘&#xff08;最好大于10G&#xff09;格式化&#xff1b;找一个好的电脑安装WEPE软件&#xff08;wepe安装链接&#xff09;&…

链表算法题(OJ刷题超详细讲解)

1.返回倒数第K个节点&#xff0c; OJ链接&#xff1a;返回倒数第K个节点 本题有很多种解法&#xff0c;例如创建数组&#xff0c;或者将原链表反转等等&#xff0c;这里们使用快慢指针&#xff0c;只需要遍历一遍链表&#xff0c;并且空间复杂度为O(1)&#xff0c;时间复杂度为…

选择困难!?伦敦金etf谁胜一筹?

虽然伦敦金和黄金ETF都是黄金的投资方式&#xff0c;但它们有着许多不一样的地方。伦敦金市场是全球最大的黄金市场之一&#xff0c;每天的交易量巨大&#xff0c;没有任何财团或机构能够人为操控它&#xff0c;而且整个市场24小时公开地运行&#xff0c;投资者可以灵活把握市场…

HCIP-RS实验-OSPF单区域配置

目录 简介&#xff1a;建立新拓扑配置IP验证IP连通性配置单区域的OSPF查看网络连通性查看路由器运行的基本OSPF信息查看路由器的OSPF邻居关系建立情况查看路由器的OSPF数据库信息。 观察路由器在以太网上邻接关系的建立过程 简介&#xff1a; OSPF&#xff08;Open Shortest P…

在C#中使用 NLog 库进行日志记录

NLog 是 .NET 的日志记录框架。具有丰富的日志路由和管理能力&#xff0c;极大地帮助您生成和管理日志。NLog 是一个库&#xff0c;可以轻松地同时记录和管理多个不同区域&#xff08;例如控制台、数据库或文本文件&#xff09;中的数据。我们可以按如下方式列出 NLog 的功能&a…

实战攻防:蜜罐无关,溯源有术

前言 突然接到通知&#xff0c;甲方在HVV防守前突然收到内网IP地址出现Socks代理通信&#xff0c;审计流量发现确实属于socks流量&#xff0c;不属于告警流量&#xff0c;告警地址为个人终端&#xff0c;直接准入工具阻断等待排查。 态感告警 流量分析属于正常的socks流量。 …

职场思考-职场第三年规划重点(14)

&#xff08;职场第三年规划重点(上)&#xff09; 确定方向&#xff0c;拉进关系&#xff0c;提高思维 好的职业生涯规划必须具备以下三个特点&#xff1a; 合理性&#xff08;以当事人的天赋、性格和现有知识与技能为基础&#xff0c;是适合并为当事人所接受的&#xff09;、可…

word-简历排版

1、确认字体&#xff08;微软雅黑&#xff09;、字号&#xff08;五号/小五&#xff09; 2、设置段间距和行间距、页边距 3、突出各模块标题&#xff0c;增加分格线 4、使用制表位进行对齐&#xff1a;视图-标尺&#xff0c;制表符&#xff08;tab&#xff09;和制表位共同使…

西贝柳斯终极版2023:Mac上的简易音乐记谱神器,谱写未来

Avid Sibelius Ultimate 2023 for Mac是一款专为Mac用户设计的音乐记谱软件&#xff0c;它以其强大的功能和直观的操作界面&#xff0c;为音乐创作者们提供了一个高效、便捷的创作平台。 一、音乐创作的得力助手 Sibelius Ultimate 2023不仅适用于有抱负的作曲家和词曲作者&a…

计算机网络学习记录 网络层 Day4(上)

计算机网络学习记录 网络层 Day4 &#xff08;上&#xff09; 你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github https://github.com/Qiuner gitee https://gitee.com/Qiuner 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f60…