当前位置: 首页 > news >正文

【javascript】如何判断一个对象属性是否存在

前言

在javascript里,可以有多种判断对象属性是否存在的方法,使用哪种方法来判断,取决于对 “存在” 两个字的定义是什么。

方法1:对比undefined

const obj = {}
if (obj.id !== undefined) {console.log('存在')
} else {console.log('不存在')
}

此种方法的缺点是,如果对象真的有一个 id 属性,但是值为undefined的话,此方法会判断为 id 属性不存在。

方法2:使用Object.keys()

const obj = {id: 1}
if (Object.keys(obj).includes('id')) {console.log('存在')
} else {console.log('不存在')
}

Object.keys()可以获取到一个对象全部自有可枚举属性,如果一个属性不符合 “自有” 和 “可枚举” 这两个条件的话,Object.keys()是获取不到的,就会导致判断为属性不存在。

自有

“自有”的意思是这个属性是对象自己的,而不是在它的原型链上,比如:

const obj = {}obj.id = 1 // 此时的id是obj的自有属性obj.__proto__.id = 1 // 此时的id不是obj的自有属性
可枚举

每一个对象属性都有一个描述符,例如下面代码是获取 obj 对象 id 属性的描述符:

const obj = {id: 1}
console.log(Object.getOwnPropertyDescriptor(obj, 'id'))
// 输出:{value: 1, writable: true, enumerable: true, configurable: true}

输出内容中的 enumerable就是可枚举的描述符,值为 true 代表此属性可枚举可遍历,false 代表不可以。

如果我们给 obj 对象添加一个不可枚举的 id 属性,会发现使用Object.keys() 方法会判断为属性不存在:

const obj = {}
// 定义一个不可枚举的属性
Object.defineProperty(obj, 'id', {value: 1,enumerable: false
})if (Object.keys(obj).includes('id')) {console.log('存在')
} else {console.log('不存在') // 输出:不存在
}

方法3:使用hasOwnProperty()

const obj = {id: 1}if (obj.hasOwnProperty('id')) {console.log('存在')
} else {console.log('不存在')
}

此方法跟 方法2 相似,区别是此方法只需要满足“属性是自有的”这一个条件就可以了,而不管属性可不可枚举,都能获取到。

方法4:使用in

const obj = {id: 1}if ('id' in obj) {console.log('存在')
} else {console.log('不存在')
}

此方法在本文提到的4种方法里,判断范围是最广的,不管属性是“自有的”还是“非自有的”,是“可枚举的”还是“不可枚举的”,它都能判断得出来。

http://www.lryc.cn/news/249268.html

相关文章:

  • Linux-hid
  • Paraformer 语音识别原理
  • 用户注册这样玩,保你平安
  • QXDM Filter使用指南
  • 智能优化算法应用:基于蝴蝶算法无线传感器网络(WSN)覆盖优化 - 附代码
  • 3dsMax插件Datasmith Exporter安装使用方法
  • Rocketmq架构
  • 中兴亮相中国国际现代化铁路技术装备展览会 筑智铁路5G同行
  • 从零学算法15
  • 《Effective C++》条款27
  • 无图谱不AI之三元组数据保存Neo4j
  • Mybatisplus同时向两张表里插入数据[事务的一致性]
  • 天眼销:精准的企业名录
  • TypeError: Cannot read properties of null (reading ‘shapeFlag‘)
  • 视频监控平台EasyCVR多场景应用,AI视频分析技术助力行业升级转型
  • 如何搭建外网可访问的Serv-U FTP服务器,轻松远程共享文件!
  • c++--类型的基础
  • Python with提前退出:坑与解决方案
  • Vue3-provide和inject
  • Python与设计模式--适配器模式
  • 大模型能否生成搜索引擎的未来?
  • 鸿蒙开发-ArkTS 语言-状态管理
  • 一篇文章带你掌握MongoDB
  • 删除docker镜像
  • 力扣 --- 删除有序数组中的重复项 II
  • Opencv图像处理(全)
  • Flutter桌面应用开发之毛玻璃效果
  • 基于C#实现优先队列
  • ssm+vue的仓库在线管理系统的设计与实现(有报告)。Javaee项目,ssm vue前后端分离项目。
  • 什么是木马