Javascript/Node.JS中如何用多种方式避免属性为空(cannot read property of undefined ERROR)

 >>>>>>问题

"cannot read property of undefined" 是一个常见的 JavaScript 错误,包含我在内很多人都会遇到,表示你试图访问一个未定义(undefined)对象的属性。这通常是因为你在访问一个不存在的对象或者变量。为了解决这个问题,你需要检查你的代码,确保在访问对象属性之前,对象已经被正确定义。

How can I avoid 'cannot read property of undefined' errors?

如何避免“无法读取未定义的属性”错误?

Given that below object , not all object has same property , normally happens in JSON format , 如果阁下遇到以下问题,a中未必包含b,b中未必包含c,甚至a也不一定存在,应该如何优雅的判断呢。

// Where this array is hundreds of entries long, with a mix
// of the two examples given
var test = [{'a':{'b':{'c':"foo"}}}, {'a': "bar"}];for (i=0; i<test.length; i++) {// OK, on i==0, but 'cannot read property of undefined' on i==1console.log(a.b.c);
}

>>>>>>解决方法

强力推荐!封装GetProperty方法,从对象中获取属性,属性不存在则返回默认值

This is a common issue when working with deep or complex JSON object, so I try to avoid try/catch or embedding multiple checks which would make the code unreadable. I usually use this little piece of code in all my projects to do the job. 

/* Example: getProperty(myObj, 'aze.xyz', 0) // return myObj.aze.xyz safely* accepts array for property names:*     getProperty(myObj, ['aze', 'xyz'], {value: null})*/
function getProperty(obj, props, defaultValue) {var res, isvoid = function(x) {return typeof x === "undefined" || x === null;}if(!isvoid(obj)) {if(isvoid(props))props = [];if(typeof props  === "string")props = props.trim().split(".");if(props.constructor === Array) {res = props.length>1 ? getProperty(obj[props.shift()], props, defaultValue) : obj[props[0]];}}return typeof res === "undefined" ? defaultValue: res;
}

思路二,我的项目中用的就是这个方法 !!! 好用

//by zhengkai.blog.csdn.net
const temp = {};
console.log(getSafe(()=>a.b.c, '0'));function getSafe(fn, defaultVal) {try {if (fn() === undefined || fn() === null) {return defaultVal} else {return fn();}} catch (e) {return defaultVal;}
}

使用默认参数值

在函数定义时,为参数设置默认值,以确保即使没有传递参数,也不会出现未定义的属性。

function example(param = "default value") {console.log(param);
}example(); // 输出 "default value"

hasOwnProperty检查属性是否存在

const obj = {key: "value"
};if (obj.hasOwnProperty("key")) {console.log(obj.key);
} else {console.log("Key does not exist");
}

 

使用逻辑或操作符(||)

const obj = {key: "value"
};console.log(obj.key || "Default value"); // 输出 "value"

使用解构赋值

const obj = {key: "value"
};const { key = "Default value" } = obj;console.log(key); // 输出 "value"

可选链操作符optional chaining语法(.?)

  • If you use JavaScript according to ECMAScript 2020 or later, see optional chaining.
  • TypeScript has added support for optional chaining in version 3.7.
// use it like this
obj?.a?.lot?.of?.properties

使用可选链操作符(?.):可选链操作符允许你在尝试访问对象的属性时提供一个后备值,以防属性不存在。 

const obj = {key: "value"
};console.log(obj?.key ?? "Default value"); // 输出 "value"

不是很建议的try/catch

A quick workaround is using a try/catch helper function with ES6 arrow function: 

function getSafe(fn, defaultVal) {try {return fn();} catch (e) {return defaultVal;}
}// use it like this
console.log(getSafe(() => obj.a.lot.of.properties));// or add an optional default value
console.log(getSafe(() => obj.a.lot.of.properties, 'nothing'));

 不够优雅的“多重判断”方法

ry this. If a.b is undefined, it will leave the if statement without any exception.

if (a && a.b && a.b.c) {console.log(a.b.c);
}

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

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

相关文章

(ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类

文章目录 相关论文摘要引言类别嵌入局限性——问题1普通ZSL模型局限性——问题2自动属性注释过程——对应问题1深度语义-视觉对齐&#xff08;DSVA&#xff09;模型——对应问题2 基于遥感多模态相似性的自动属性标注属性词汇表构造使用CLIP模型自动标注属性对CLIP模型进行训练…

Odoo中编写和执行自动化测试用例

在Odoo中&#xff0c;自动化测试是确保模块功能按预期工作的重要部分。自动化测试有助于在开发过程中快速发现和修复错误&#xff0c;提高软件质量&#xff0c;并确保代码更改不会引入新的问题。Odoo支持两种类型的测试&#xff1a;Python单元测试和YAML测试&#xff08;在较新…

YoloV8实战:使用YoloV8实现水下目标检测(RUOD)

摘要 水下目标检测技术在生态监测、管道检修、沉船捕捞等任务中发挥着重要作用。常用的检测方法包括高清视像、侧扫声呐等。光学图像检测因高分辨率和灵活性&#xff0c;在近距离检测中优势显著。但水下图像受水体吸收、衰减、光源分布等影响&#xff0c;呈现蓝绿色&#xff0…

ideaSSM 网上选课管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 网上选课管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff…

哈希-字母异位词分组

字母异位词&#xff0c;词频一样&#xff0c;但是顺序不一样&#xff0c;可以进行排序&#xff0c;获取一个key&#xff0c;放在map中即可。 class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> ma…

清明的商标从已注册到不良影响的变化!

清明时节雨纷纷&#xff0c;“清明”可以申请注册商标不&#xff0c;普推知产老杨经检索发现&#xff0c;2022年还有以“清明”通过初审下证的&#xff0c;在这之前更多&#xff0c;还有“清明”在方便食品类别上是著名商标&#xff0c;那个2022年通过初审的正在无效程序中。 2…

mbti,INTJ型人格的心理问题分析

什么是INTJ型人格&#xff1f; INTJ来自mbti职业性格测试&#xff0c;16种人格类型之一&#xff0c;INTJ分别代表内向&#xff0c;直觉&#xff0c;理智&#xff0c;独立&#xff0c;而INTJ型人格是一种以冷静和理性著称的人格&#xff0c;这种人格的人总给人一种比较理智&…

Linux下I2C驱动框架: I2C驱动框架与I2C总线驱动(即I2C控制器)

一. 简介 现在&#xff0c;我们来学习一下如何在 Linux 下开发 I2C 接口器件 驱动&#xff0c;重点是学习 Linux 下的 I2C 驱动框架&#xff0c;按照指定的框架去编写 I2C 设备驱动。 本文来了解以下 Linux下 I2C 驱动框架&#xff0c;框架下的 i2C总线驱动&#x…

力扣40 组合总和Ⅱ Java版本

文章目录 题目描述代码 题目描述 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 示例 1:…

16、Lua 协同程序(coroutine)

Lua 协同程序 Lua 协同程序什么是协同(coroutine)&#xff1f;线程和协同程序区别基本语法以下实例演示了以上各个方法的用法 生产者-消费者问题 Lua 协同程序 什么是协同(coroutine)&#xff1f; Lua协同程序(coroutine)与线程比较类似&#xff1a;拥有独立的堆栈&#xff0…

图解大型网站多级缓存的分层架构

前言 缓存技术存在于应用场景的方方面面。从浏览器请求&#xff0c;到反向代理服务器&#xff0c;从进程内缓存到分布式缓存&#xff0c;其中缓存策略算法也是层出不穷。 假设一个网站&#xff0c;需要提高性能&#xff0c;缓存可以放在浏览器&#xff0c;可以放在反向代理服…

uniapp原生下拉刷新在手机上不起作用

开启原生下拉刷新时&#xff0c;页面里使用了全屏高的scroll-view&#xff0c;向下拖动内容时&#xff0c;会优先触发scroll-view滚动而不是下拉刷新。 "enablePullDownRefresh": true, 这就可能会导致下拉刷新不起作用&#xff0c;这时候就需要做到取舍&#xff0c…

设计模式(12):代理模式

一.核心作用 通过代理&#xff0c;控制对对象的访问;可以详细控制访问某个对象的方法&#xff0c;在调用这个方法前做前置处理&#xff0c;调用这个方法后做后置处理。 二.核心角色 抽象角色&#xff1a; 定义代理角色和真实角色的公共对外方法;真实角色&#xff1a; 实现抽…

【智能排班系统】雪花算法生成分布式ID

文章目录 雪花算法介绍起源与命名基本原理与结构优势与特点应用场景 代码实现代码结构自定义机器标识RandomWorkIdChooseLocalRedisWorkIdChooselua脚本 实体类SnowflakeIdInfoWorkCenterInfo 雪花算法类配置类雪花算法工具类 说明 雪花算法介绍 在复杂而庞大的分布式系统中&a…

小坤二次元导航HTML源码

源码介绍 小坤二次元导航HTML源码&#xff0c;很好看的一个htmlの引导页/导航页&#xff01;需要的上&#xff01; 源码下载 小坤二次元导航HTML源码

游戏攻略|基于Springboot和vue的游戏分享平台系统设计与实现(源码+数据库+文档)

游戏攻略分享平台 目录 基于Springboot和vue的游戏分享平台系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、前台&#xff1a; 2、后台 管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a…

ubuntu23设置kibana后台启动服务

要在Ubuntu 23系统中设置Kibana作为系统服务&#xff0c;以便能够通过systemd管理其启动、停止、重启以及设置开机自动启动&#xff0c;可以按照以下步骤操作&#xff1a; 1. 创建Kibana systemd服务单元 创建一个名为kibana.service的文件在 /etc/systemd/system/ 目录下&am…

python绘制子图(旭日图、渐变堆积面积图、多数据折线图、比例关系图)

大家好&#xff0c;我是带我去滑雪&#xff01; 子图可以更清晰地展示和理解复杂的数据关系&#xff0c;通过将数据分成多个小图&#xff0c;有助于观察数据间的关系和趋势。减少数据之间的重叠和混淆&#xff0c;使得每个子图更易于理解和解释。不同类型的子图可以呈现数据的不…

蓝鲸6.1 CMDB 事件推送的开源替代方案

本文来自腾讯蓝鲸智云社区用户&#xff1a;木讷大叔爱运维 背景 在蓝鲸社区“社区问答”帖子中发现这么一个需求&#xff1a; 究其原因&#xff0c;我在《不是CMDB筑高墙&#xff0c;运维需要一定的开发能力&#xff01;》一文中已经介绍&#xff0c;在此我再简单重复下&#…

mysql知识点梳理

mysql知识点梳理 一、InnoDB引擎中的索引策略&#xff0c;了解过吗&#xff1f;二、一条 sql 执行过长的时间&#xff0c;你如何优化&#xff0c;从哪些方面入手&#xff1f;三、索引有哪几种类型&#xff1f;四、SQL 约束有哪几种呢&#xff1f;五、drop、delete、truncate的区…