如何安全检查对象多层嵌套属性避免读取undefined报错
JS 嵌套属性安全访问判断方法
多层嵌套属性访问链路中任意一层缺失就会抛出Cannot read properties of undefined错误,可根据项目兼容场景选择以下方案实现:
方案1:可选链操作符(ES2020 及以上,首选)
可选链操作符?.会在链路中任意一级返回null/undefined时直接短路返回undefined,不会继续向下访问触发报错,是目前最简洁的写法。注意动态属性键的可选链语法为?.[键名],对应判断代码如下:
if ( this.solvedConflictsDetails?.[this.instance.instanceId]?.[this.model.name]?.[this.entity.entityId]?.solved ) { // 业务逻辑 }
如果需要兼容IE等不支持ES2020的环境,可以搭配babel转译,或者选择下面的兼容方案。
方案2:逐层短路判断(全环境兼容)
利用逻辑与&&的短路特性,从最外层属性开始逐层判断存在性,只要任意一层不存在就终止判断,不会触发后续属性访问报错,写法无任何兼容问题:
const targetEntity = this.solvedConflictsDetails && this.solvedConflictsDetails[this.instance.instanceId] && this.solvedConflictsDetails[this.instance.instanceId][this.model.name] && this.solvedConflictsDetails[this.instance.instanceId][this.model.name][this.entity.entityId] // 无可选链环境直接写 && targetEntity.solved 即可 if (targetEntity?.solved) { // 业务逻辑 }
方案3:封装通用嵌套取值工具(高频场景复用)
如果项目中存在大量深层嵌套属性访问的场景,可以封装一个通用取值工具,避免重复写冗长的逐层判断逻辑:
/** * 安全读取嵌套对象属性 * @param {any} source 源对象 * @param {Array<string|number>} path 属性访问路径数组 * @param {any} defaultValue 取值失败时返回的默认值 * @returns {any} */ function getSafeValue(source, path, defaultValue = undefined) { let current = source for (const key of path) { if (current === null || current === undefined) return defaultValue current = current[key] } return current === undefined ? defaultValue : current } // 调用示例 const isSolved = getSafeValue(this, [ 'solvedConflictsDetails', this.instance.instanceId, this.model.name, this.entity.entityId, 'solved' ], false) if (isSolved) { // 业务逻辑 }
避坑提示:不要用
try/catch包裹原始访问语句吞错,这种写法会屏蔽链路中其他非属性不存在导致的代码错误,提升排查问题的成本,不推荐使用。
内容的提问来源于stack exchange,提问作者shalamel_bartalogonos
相关产品推荐
相关产品推荐

