判断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 检查以避免误判。

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows系统电脑本地部署AI音乐创作工具并实现无公网IP远程使用

文章目录 前言1. 本地部署2. 使用方法介绍3. 内网穿透工具下载安装4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows系统电脑上快速本地部署一个文字生成音乐的AI创作工具MusicGPT&#xff0c;并结合cpolar内网穿透工具实现随时随地远程访问使用。 MusicG…

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

目录 一.优化生产流程 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 质量提升…

R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习技术应用

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…

使用 Django 实现定时任务

文章目录 Celery 简介步骤1. 安装 Celery2. 配置 Celery3. 创建 Celery 任务4. 启动 Celery Worker5. 调度定时任务6. 定时调度任务7. 启动 Celery Beat 在许多 Web 应用程序中&#xff0c;需要执行定期的任务&#xff0c;比如数据备份、邮件发送或者清理任务。Django 提供了多…

无线麦克风哪个品牌音质最好?多款热门电视k歌麦克风推荐

随着直播和自媒体的蓬勃发展&#xff0c;越来越多的人怀揣着梦想&#xff0c;投身到视频拍摄和直播的广阔天地中。在这个充满创意与激情的领域里&#xff0c;声音质量就像一幅画的色彩&#xff0c;为作品增添了生动与活力。无线麦克风&#xff0c;作为声音的捕捉者&#xff0c;…

如何利用AI大模型给我写程序

文章目录 1&#xff0c;应用情景&#xff08;给文件夹里的图片批量重命名&#xff09;2&#xff0c;选择合适的AI大模型3&#xff0c;复制AI给出来的代码&#xff0c;在本地执行4&#xff0c;结果检查 1&#xff0c;应用情景&#xff08;给文件夹里的图片批量重命名&#xff09…

Vue2 若依常见问题

路由跳转并关闭当前tabs标签页 // 关闭当前tabs this.$store.dispatch("tagsView/delView", this.$route); // 跳转路由 this.$router.replace({ path: /test });// 返回 this.$router.go(-1); this.$router.push({path: path, query: param}); // 跳转 this.$route…

Python实用代码片段分享(三)

在今天的博文中&#xff0c;我们将继续分享一些Python编程中非常实用的代码片段。这些代码片段将帮助你更高效地处理常见任务&#xff0c;从字符转换到数据类型检查&#xff0c;应有尽有。 1. ord函数和chr函数 Python的ord()函数可以返回Unicode字符对应的ASCII码值&#xf…

sigmoid, softmax

∙ \bullet ∙ sigmoid函数 值域(0,1) 常用于二分类问题 ∙ \bullet ∙ softmax函数 每一项的区间范围的(0,1) 所有项相加的和为1. 常用于多分类问题 ∙ \bullet ∙ 区别&#xff1a; softmax 当类别数是2时&#xff0c;它退化为二项分布&#xff0c;而它和sigmoid真正的区别…

水库大坝安全监测系统建设方案

一、背景 随着自动化技术的进步&#xff0c;大部分水库大坝不同程度地实现了安全监测自动化。但仍存在以下问题&#xff1a; 1、重建轻管&#xff0c;重视安全监测系统建设&#xff0c;不够重视运行维护。 2、缺乏系统性、综合性及相关性的资料分析功能。 3、软件大多为数据…

Linux应用 sqlite3编程

1、概念 SQLite3是一个轻量级的、自包含的、基于文件的数据库管理系统&#xff0c;常用于移动设备、嵌入式设备和小型应用程序中&#xff0c;应用场景如下&#xff1a; 移动应用程序&#xff1a;由于SQLite3是零配置、无服务器的数据库引擎&#xff0c;非常适合用于移动应用程…

@vue-office/excel 解决移动端预览excel文件触发软键盘

先直接上代码 不耽误大家时间 标明下插件库 非常感谢作者提供预览插件 vue-office/excel 只需要控制CSS :deep(.x-spreadsheet-overlayer) {.x-spreadsheet-selectors {display: none !important;} } :deep(.x-spreadsheet-bottombar) {li.active {user-select: none !import…

PCIe Capability and Extended Capability

PCIe&#xff08;Peripheral Component Interconnect Express&#xff09;是一种用于连接扩展卡到计算机主板的高速串行总线标准。PCIe Capability 和 Extended Capability 是 PCIe 设备的两种重要特性。 1. **PCIe Capability&#xff1a;** PCIe Capability 是指 PCIe 设备的…

HR人才测评,如何做管理岗位的领导力测评?

管理岗位的领导力测评是企业HR人才测评中的重要内容之一&#xff0c;其目的是为了评估管理人员的领导能力和潜力&#xff0c;以便企业在选拔、培养和晋升管理人员时更加科学和有效。 1.明确测评目标和指标 领导力包含多个方面&#xff0c;如领导风格、组织管理、团队建设、决…

2024上海国际钢丝绳及吊索具展览会

2024上海国际钢丝绳及吊索具展览会 2024 Shanghai International Wire Rope and Hanger Exhibition 时间&#xff1a;2024年12月18日--20日 地点&#xff1a;上海新国际博览中心 详询主办方陆先生 I38&#xff08;前三位&#xff09; I82I&#xff08;中间四位&#xff…

Activiti7 Maven笔记

通过maven完成BPMN的创建,定义流程,部署流程,完成流程等操作 代码整合创建maven项目添加log4j日志配置添加activiti配置文件创建数据库 activitijava类编写程序生成表如果代码运行,没有生成表,可能是没有读取到activiti的配置文件 Activiti数据表介绍类关系图工作流引擎创建默认…

城市之旅:使用 LLM 和 Elasticsearch 简化地理空间搜索(一)

作者&#xff1a;来自 Elastic Philipp Kahr, Valentin Crettaz 这篇博文的本地部署实践 Jupyter notebook 请详细阅读文章 “城市之旅&#xff1a;使用 LLM 和 Elasticsearch 简化地理空间搜索&#xff08;二&#xff09;”。 探索如何从自然语言提问创建地理空间搜索。在下…

微信公众号【原子与分子模拟】: 熔化温度 + 超导电性 + 电子化合物 + 分子动力学模拟 + 第一性原理计算 + 数据处理程序

往期内容主要涵盖&#xff1a; 熔化温度 超导电性 电子化合物 分子动力学模拟 第一性原理计算 数据处理程序 【1】熔化温度 分子动力学 LAMMPS 相关内容 【文献分享】分子动力学模拟 LAMMPS 熔化温度 晶体缺陷 熔化方法 LAMMPS 文献&#xff1a;金属熔化行为的局域…

[数据集][目标检测]水下管道泄漏破损检测数据集VOC+YOLO格式2069张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2069 标注数量(xml文件个数)&#xff1a;2069 标注数量(txt文件个数)&#xff1a;2069 标注…

SpringCloud Consul基础入门与使用实践总结

【1】Consul简介 官网地址&#xff1a;https://www.consul.io/intro/index.html 下载地址&#xff1a;https://www.consul.io/downloads.html 中文文档&#xff1a;https://www.springcloud.cc/spring-cloud-consul.html ① 基础概念 Consul 是一套开源的分布式服务发现和…