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

这篇具有很好参考价值的文章主要介绍了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?

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

node.js中不为空显示a如果为空显示b,Vue/Node.js/JavaScript,javascript,前端,vue.js,属性为空,对象

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==1
    console.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.文章来源地址https://www.toymoban.com/news/detail-845583.html

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

到了这里,关于Javascript/Node.JS中如何用多种方式避免属性为空(cannot read property of undefined ERROR)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python Matplotlib 中如何用 plt.savefig 存储图片

    plt.show()展示图片的时候,截图进行保存,图片不是多么清晰 如何保存高清图也是一知识点 函数包名: import matplotlib.pyplot as plt 主要功能 :保存绘制数据后创建的图形。使用此方法可以将创建的图形保存 函数源码: (根据需要进行选择) 参数解释: 参数 描述 fname 指定格式

    2024年02月01日
    浏览(44)
  • SQL中如何用快照,恢复被误删的数据?

    什么是快照 数据库快照是sql server 2005的一个新功能。MSDN上对它的定义是: 数据库快照是数据库(称为“源数据库”)的只读静态视图。在创建时,每个数据库快照在事务上都与源数据库一致。在创建数据库快照时,源数据库通常会有打开的事务。在快照可以使用之前,打开

    2024年02月13日
    浏览(44)
  • Excel中如何用计算公式或表达式直接计算出结果?

    目录 Excel中如何用计算公式或表达式直接计算出结果? 1、例如:我们需要用E列的计算公式(表达式),直接计算出结果填至F列 2、另一种方法:在菜单栏中点击【公式】再点击【定义名称】自动弹出对话框, ​3、修改【名称】可以随意填汉字或者英文字母G;【引用位置】改

    2024年02月14日
    浏览(39)
  • js 获取url的多种方式

    window.location.href:这个属性返回当前窗口(当前页面、iframe)的完整 URL。 window.parent.location.href 是上一层页面跳转url window.top.location.href 是最外层的页面跳转url document.URL:这个属性也可以用来获取当前窗口的完整 URL window.location.toString():使用该方法同样可以获得当前页面的完整

    2024年02月08日
    浏览(37)
  • 嵌入式中如何用C语言操作sqlite3(07)

    sqlite3编程接口非常多,对于初学者来说,我们暂时只需要掌握常用的几个函数,其他函数自然就知道如何使用了。 本篇假设数据库为my.db,有数据表student。 no name score 4 嵌入式开发爱好者 89.0 创建表格语句如下: sqlite3_open sqlite3_close sqlite3_get_table 举例 下面比如我们要显示st

    2024年02月07日
    浏览(47)
  • ubuntu中如何用docker下载华为opengauss数据库(超简单)

    openGauss 是一款全面友好开放,携手伙伴共同打造的企业级开源关系型数据库。openGauss采用木兰宽松许可证v2发行,提供面向多核架构的极致性能、全链路的业务、数据安全、基于AI的调优和高效运维的能力。openGauss深度融合华为在数据库领域多年的研发经验,结合企业级场景

    2024年02月08日
    浏览(45)
  • 树莓派Debian系统中如何用mDNS广播自己的ip地址

    在 Debian 系统的树莓派上使用 mDNS(Multicast DNS)广播其 IP 地址通常涉及到 Avahi 服务的使用。Avahi 是 Linux 系统中的一个零配置网络(Zeroconf)实现,它允许设备在没有配置DNS服务器的情况下通过网络发现服务和主机名。 以下是在树莓派上设置 Avahi 以使用 mDNS 的步骤: 安装 A

    2024年02月02日
    浏览(42)
  • JavaScript【Text 节点、Node 节点属性(nodeName、nodeValue 、textContent、nextSibling、previousSibling)】(十二)

    目录 Text 节点 Text节点属性 Text节点方法 appendData() deleteData()  insertData()  replaceData()

    2024年02月12日
    浏览(30)
  • 【JS】js数组分组,javascript实现数组的按属性分组

    项目代码中有很多时候需要按一定的条件实现按属性分组 你可以使用JavaScript的 Array.prototype.reduce() 方法来将数组分组。这是一种高级的方法,它可以将数组元素组合成一个单值。在这种情况下,你可以使用它来把数组元素放到一个对象中,其中对象的键是分组的条件,值是所

    2023年04月08日
    浏览(50)
  • 写一个java中如何用JSch来连接sftp的类并做测试?(亲测)

    当使用JSch连接SFTP服务器的类,并进行测试时,可以按照以下步骤操作: 添加JSch库的依赖项。在你的项目中添加JSch库的Maven依赖项(如前面所述)或下载JAR文件并将其包含在项目中。 dependency     groupIdcom.jcraft/groupId     artifactIdjsch/artifactId     version0.1.55/version /dependency 创建

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包