在 JavaScript 中,除了使用可选链操作符,还有哪些方法可以安全地访问对象的深层属性?

在JavaScript中,除了使用可选链操作符(`?.`),还有几种方法可以安全地访问对象的深层属性,避免因访问不存在的属性而抛出错误。以下是一些常用的方法:

1. 条件(三元)运算符:
   使用条件运算符来检查属性是否存在于对象中。

 const value = obj && obj.prop && obj.prop.subProp ? obj.prop.subProp.value : null;

2. 逻辑与(`&&`)操作符:
   逻辑与操作符可以用来确保只有当左侧表达式为真值时才计算右侧表达式。

const value = obj && obj.prop && obj.prop.subProp && obj.prop.subProp.value;

3. try-catch 语句:
   使用try-catch来捕获在访问深层属性时可能发生的任何类型错误。

   let value;try {value = obj.prop.subProp.value;} catch (error) {value = null; // 或者进行其他错误处理}

4. 循环:
   使用循环遍历对象的键,直到达到所需的深度。

 let current = obj;['prop', 'subProp', 'targetProp'].forEach(key => {if (current[key] !== undefined) {current = current[key];} else {current = null;return; // 退出循环}});// current 现在包含目标值,或者在某个点为 null

5. Lodash 等工具库:
   使用如Lodash这样的工具库提供的函数,例如`get`函数,可以安全地访问深层属性。

   import _ from 'lodash';const value = _.get(obj, 'prop.subProp.value', null);

6. Proxy:
   通过代理对象,可以在访问属性时设置自定义的行为。

   const obj = new Proxy({}, {get: function(target, prop) {return prop in target ? target[prop] : null;}});

7. 手动检查:
   在访问每个属性之前手动检查它是否存在。

   if (obj && typeof obj.prop === 'object' && 'subProp' in obj.prop) {const value = obj.prop.subProp.value;}

8. 使用 `hasOwnProperty` 方法:
   检查对象是否具有特定的属性。

   if (obj.hasOwnProperty('prop') && obj.prop.hasOwnProperty('subProp')) {const value = obj.prop.subProp.value;}

9. 使用 `in` 操作符:
   检查属性是否存在于对象或其原型链上。

   if ('prop' in obj && 'subProp' in obj.prop) {const value = obj.prop.subProp.value;}

使用这些方法可以有效地避免在访问对象深层属性时出现的错误,同时保持代码的清晰和可维护性。

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

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

相关文章

以太网基础 -- LLDP使用案例

LLDP使用技术报告 背景 链路层发现协议(Link Layer Discovery Protocol,LLDP)是一种网络协议,主要用于在以太网网络中发现相邻设备并与其交换信息。LLDP是一种开放的标准,由IEEE 802.1AB定义,能够跨多个厂…

dubbo服务引用

spring刷新容器的时候,ReferrenceBean只有被调用的情况下才会在createBean回调afterPropertiesSet的时候引入服务。 ReferrenceBean实现了FacotryBean的接口,当对任意服务Interface进行自动注入或者getBean获取,会触发getObject过程 本地服…

TensorBoard在pytorch训练过程中如何使用,及数据读取问题解决方法

TensorBoard 模块导入日志记录文件的创建训练中如何写入数据如何提取保存的数据调用TensorBoard面板可能会遇到的问题 模块导入 首先从torch中导入tensorboard的SummaryWriter日志记录模块 from torch.utils.tensorboard import SummaryWriter然后导入要用到的os库&#xff0…

通过一个例子,说明Python的责任链设计模式有什么优缺点

责任链设计模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将一个请求沿着处理者链进行传递,直到有一个处理者处理它为止。在Python中,这种模式可以通过多种方式实现,通常涉及到一系列对象…

方案设计|汽车轮胎数显胎压计方案

一、引言 数显轮胎胎压计是一个专门测量车辆轮胎气压的工具,它具有高精度测量的功能,能够帮助快速准确获取轮胎气压正确数值,保证轮胎使用安全。本文将对数显轮胎胎压计的方案技术进行分析,包括其基本原理、硬件构成、软件设计等方…

架构学习:什么是业务架构图?如何画业务架构图?

6.1~6.18,艾威618年中大促,钜惠来袭!想报课但还没下手的小伙伴,都可以行动起来啦!活动规则还是一如既往的简单、粗暴——直接立减、返现、抽奖以及送礼品!了解活动详情,请点击这里》》 业务架构…

ActiViz中的vtkVolumeMapper

文章目录 一、简介二、工作原理三、核心功能四、使用步骤五、配置与优化六、案例与应用七、扩展与集成八、结论一、简介 vtkVolumeMapper是 ActiViz库中专为处理和渲染三维体积数据设计的核心组件。在诸如医学成像、地质科学、气象模型及工程仿真等多个领域,它扮演着至关重要…

【源码】SpringBoot事务注册原理

前言 对于数据库的操作,可能存在脏读、不可重复读、幻读等问题,从而引入了事务的概念。 事务 1.1 事务的定义 事务是指在数据库管理系统中,一系列紧密相关的操作序列,这些操作作为一个单一的工作单元执行。事务的特点是要么全…

实验9 浮动静态路由配置

--名称-- 一、 原理描述二、 实验目的三、 实验内容四、 实验配置五、 实验步骤 一、 原理描述 浮动静态路由也是一种特殊的静态路由,主要考虑链路冗余。浮动静态路由通过配置一条比主路由优先级低的静态路由,用于保证在主路由失效的情况下,…

代码随想录 day27|day28|day29

回溯2 切割问题:是在每个节点判断是否是要剪枝收割元素。 startidx 是切割起点,i是本次切割终点 分割回文串 复原ip地址 非递减子序列 都是在树的节点依照题意判断,之后决定是否剪枝。 也就是都有if判断来剪枝 。 下面是非递减子序列。 下…

Python | 虚拟环境的增删改查

mkvirtualenv创建虚拟环境 mkvirtualenv是用于在Pyhon中创建虚拟环境的命令。它通过使用vitualenv库来创建一个隔离的Python环境,以便您可以安装特定版本的Python包,而不会影响全局Python环境。 使用方法: 安装virtualenv:pip install vir…

前端将xlsx转成json

第一种方式,用js方式 1.1先安装插件 万事都离不开插件的支持首先要安装两个插件 1.2. 安装xlsx cnpm install xlsx --save注:这块我用的cnpm,原生的是npm,因为镜像的问题安装了cnpm,至于怎么装网上一搜一大堆 1.3安…

用langchain搭配最新模型ollama打造属于自己的gpt

langchain 前段时间去玩了一下langchain,熟悉了一下大模型的基本概念,使用等。前段时间meta的ollama模型发布了3.0,感觉还是比较强大的,在了解过后,自己去用前后端代码,调用ollama模型搭建了一个本地的gpt应用。 核心逻辑 开始搭…

Vue 封装elementUI的el-popover

1.封装公共组件 <template><div class"confirm-popover disInlineBlock ml10"><el-popover placement"bottom" v-model"visible" :trigger"triggerType"><div class"confirm-popover-popover"><…

vue3中进度条上加高亮圆点

实现效果 小圆点基于进度条定位&#xff08;left&#xff09;。 实现代码 <template><!-- 这块代码实现的功能&#xff1a;progressData遍历的年份进度数组&#xff0c;展示每年完成的进度--><ul><li v-for"(item, index) in progressData" :k…

Unity VR 零基础开发之 Pico4 MR

一、新建Unity2021.3.37 3D工程 二、切换到Android安卓平台 1、点击Unity编辑器左上角的Flie后&#xff0c;选择Build Setting选项。 2、弹出弹窗后&#xff0c;点击Android选项&#xff0c;然后再点击Switch Platform按钮切换成安卓平台。 3、切换完成后Android选项后面会显示…

Centos7下安装sqlplus并连接远程数据库

已经不用Oracle好多年了&#xff0c;然而近期有项目居然需要用到Oracle&#xff0c;并且是在内网的&#xff0c;所以没办法直接安装数据库连接工具来测试连接&#xff0c;只能在Linux的服务器上面安装sqlplus工具来连接&#xff0c;找资料完成了安装和连接&#xff0c;遂记录。…

3. QGis二次开发项目实践一之解决“无法定位程序输入点“

前言 本章讲述实现本项目实现过程中遇到的QGis二次开发库版本和Qt以及其他动态库的版本匹配问题问题复现 本项目是要作为一个子模块集成到用户的项目中本项目最初的开发环境为QGis3.28+Qt5.15.2,而当时并未问清楚用户开发环境所以交付给用户之后,出现了类似下图的问题 出现该…

uniapp利用canvas绘制ECG网格图附带心电图显示------代码

之前是一个关于如何绘制心电图的代码&#xff0c;后续需求是添加ECG的网格背景图也是利用canvas绘制的 先看代码&#xff1a; <template><view><page-head :title"title"></page-head><!-- 心电图显示区 --><view class"disp…

AI论文:一键生成论文的高效工具

说到这个问题&#xff0c;那真的得看你对“靠谱”的定义是怎样的啦&#xff1f; 众所周知&#xff0c;写论文是一项极其耗时间的事情&#xff0c;从开始的选题到文献资料搜索查阅&#xff0c;大纲整理等等一大堆的繁杂工作是极艰辛的。用AI写论文就不一样了&#xff0c;自动化…