详解JS如何判断对象上是否存在某个属性
作者:只会番茄炒蛋 发布时间:2024-04-16 09:49:28
判断某一个对象里面是否存在某个属性,常见错误场景排查,但是你真的知道该如何使用嘛。
关于这个问题,大家第一眼看到脑海中肯定会有多种方案去实现,但你有具体想过每个方案的实现有哪些其他问题存在嘛,这样的写法是否错误等,实际上在实现这个需求的的时候大家都会犯很多常见的问题。这个问题也是往往能考察出大家基础知识掌握的熟练不熟练。
以下列出几种错误的写法,方便大家去思考错在哪里,为什么错了
第一种
判断这个属性是否有值
/**
* @method hasProperty 判断对象中是否存在某个属性
* @param {Object} obj
* @param {String} key
* @returns Boolean
*/
function hasProperty(obj, key) {
return obj[key] !== undefined;
}
以上的方法有个明显的错误,假如我这个对象刚好有个属性的值就是undefined的话
const obj = { a: undefined };
hasProperty(obj, "a"); // false
所以不能用undefined去做判断
第二种
通过Object.keys()方法得到对象里所有属性形成的数组,然后使用includes方法判断该属性存不存在
/**
* @method hasProperty 判断对象中是否存在某个属性
* @param {Object} obj
* @param {String} key
* @returns Boolean
*/
function hasProperty(obj, key) {
return Object.keys(obj).includes(key);
}
const obj = { a: undefined };
hasProperty(obj, "a"); // true
通过上述方法,我们发现它实现了第一种方式不能判断undefined的方法,感觉这个方法好像可以,但是有另外的一种情况它又不能判断了
const obj = { a: undefined, b: 1 };
Object.defineProperty(obj, "c", {
value: 2,
enumerable: false,
});
console.log(obj.c); // 2
hasProperty(obj, "c"); // false
我们通过Object.defineProperty给该对象添加一个c属性值为2,但是不可遍历,这时候发现判断c属性是否存在时是拿不到c的,说明这种方案也存在缺陷。
第三种
使用js提供的一个函数hasOwnProperty,这是js专门提供的一个用来判断对象里面是否存在某一个属性的方法
/**
* @method hasProperty 判断对象中是否存在某个属性
* @param {Object} obj
* @param {String} key
* @returns Boolean
*/
function hasProperty(obj, key) {
return obj.hasOwnProperty(key);
}
const obj = { a: undefined, b: 1 };
Object.defineProperty(obj, "c", {
value: 2,
enumerable: false,
});
hasProperty(obj, "c"); // true
我们发现这个方案实现了上述两种方案缺陷的部分,也能正确的判断了,但是问题来了,这个方法有没有缺陷呢?没错它也有缺陷
console.log(hasProperty(obj, "toString")); // false
console.log(obj.toString); // [Function: toString]
没错,如果你基础知识掌握的可以的话你会知道,对象的原型链上存在一个toString方法,但是上述的方案就没办法判断了,因为hasOwnProperty只能判断自身的属性,没有办法判断原型链上的属性,但通常我们能说到这个方案也基本可以了。那有没有最终的解决方案呢
最佳方案
通过 in 关键判断,它不单单能判断属性是否在对象身上,它还可以通过原型链去查找
/**
* @method hasProperty 判断对象中是否存在某个属性
* @param {Object} obj
* @param {String} key
* @returns Boolean
*/
function hasProperty(obj, key) {
return key in obj;
}
const obj = { a: undefined, b: 1 };
Object.defineProperty(obj, "c", {
value: 2,
enumerable: false,
});
hasProperty(obj, "toString"); // true
通过上述的几种方案我想大家应该知道为什么会采用最后一种方案来判断对象上是否存在某个属性,当然在某些业务场景下可能上述的几种方案都能满足需求,但我们一定是熟练掌握基础知识后才能知道在哪种业务场景下使用哪种方案。
来源:https://juejin.cn/post/7238845423379710013


猜你喜欢
- 1、string-->numberstring类型 *1 即可变成 number类型2
- 描述tan() 返回x弧度的正弦值。语法以下是 tan() 方法的语法:import mathmath.tan(x)注意:tan()是不能直
- 引言在 Python 中,输入和输出格式化是一项重要的技能,它可以帮助你更好地与用户进行交互,以及更有效地展示数据。本节将介绍如何使用字符串
- 在IE下,获取Param的时候有个诡异现象(不知道算不算bug)。为了清晰起见,下面用最简单的HTML和JavaScript来说明。有这么一
- 有 N 个花园,按从 1 到 N 标记。在每个花园中,你打算种下四种花之一。paths[i] = [x, y] 描述了花园 x 到花园 y
- 这里采用PyCharm专业版可以直接创建Django项目,这里面自动部署了Django的基本环境。在创建项目时选择Django项目:第一次建
- go fmt命令主要是用来帮你格式化所写好的代码文件【很多第三方集成软件都是使用了go fmt命令】一、使用:go fmt <文件名&
- 功能: 1、 允许/限制对表的修改 2、 自动生成派生列,比如自增字段 3、 强制数据一致性 4、 提供审计和日志记录 5、 防止无效的事务
- 下载小姐姐图片并保存请求的地址伪装定位元素下载图片保存好了下面开始我们的实战,这个是我们今天访问的url:url = 'http:/
- 本文实例讲述了Python实现的排列组合计算操作。分享给大家供大家参考,具体如下:1. 调用 scipy 计算排列组合的具体数值>&g
- 前言: 年底了,你的数据库是不是该巡检了?一般巡检都会关心密码安全问题,比如密码复杂度设置,是否有定期修改等。特别是进行等保评测时
- 我们用pycharm打开自己写的代码,当多个文件之间有相互依赖的关系的时候,import无法识别自己写的文件,但是我们写的文件又确实在同一个
- 1. 原因(1)js代码是运行在内存中的,代码运行时的所有变量、函数都是保存在内存中。(2)刷新页面,以前申请的内存被释放,重新加载脚本代码
- 通过本篇内容给大家介绍一下Python实现金融数据可视化中两列数据的提取、分别画、双坐标轴、双图、两种不同的图等代码写法和思路总结。impo
- php创建JSON数据详解:<?php //创建一个字符数组 $arr=array( 'id'
- 初学框架vue搭配vux使用发现这个UI库使用有些力不从心。下面说说自己在表单验证过程遇到的两个需求问题及解决的方法。1.使用x-input
- 这篇文章主要介绍了Python Django 简单分页的实现代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 1.数组中已存在两个可直接用来重排序的方法:reverse()和sort()。reverse()和sort()方法的返回值是经过排序后的数组
- 图像显示和打印面临的一个问题是:图像的亮度和对比度能否充分突出关键部分。这里所指的“关键部分”在 CT 里的例子有软组织、骨头、脑组织、肺、
- 之前有看过一个博文写的是白社会的设计很好但运营却有些遭,因为对每一个WebGame的推出时间把握不准,会有几个应用同时上线造成影响力的冲突,