JavaScript中如何安全获取对象深层属性值,避免逐层校验?
JavaScript安全获取深层对象属性的简洁方案
有多种比逐层嵌套判断更简洁的方案可以实现需求,常用的方案如下:
方案1:ES2020 可选链操作符(生产环境首选)
这是目前官方原生支持的最简洁写法,可选链操作符?.会在访问路径中出现null/undefined时直接短路返回undefined,不会抛出异常:
// 安全获取属性,中间任意一层不存在也不会报错 const level3Value = object.level1?.level2?.level3 console.log(level3Value) // 属性存在时返回foo,否则返回undefined
如果需要在属性不存在时设置兜底默认值,可以搭配同是ES2020推出的空值合并运算符??使用:
// 仅当属性路径不存在/最终值为undefined/null时,返回兜底默认值 const level3Value = object.level1?.level2?.level3 ?? '默认值'
注意:
??和逻辑或||的判定规则不同,||会把0、空字符串''、false这类合法假值也判定为需要替换为默认值,如果你需要保留这类合法假值,请使用??作为兜底运算符。
目前所有现代浏览器、Node.js 14+版本都原生支持这两个运算符,如果你需要兼容更低版本环境,用Babel做语法转译即可正常使用。
方案2:自定义通用工具函数(兼容老旧环境)
如果你的项目不需要引入转译工具,可以自己实现一个通用的深层属性获取函数,一次封装后全局通用:
/** * 安全获取对象深层属性 * @param {object} obj 目标对象 * @param {string|array} path 属性路径,支持 'a.b.c' 或者 ['a','b','c'] 两种写法 * @param {any} defaultValue 可选参数,属性不存在时返回的兜底值 * @returns {any} 属性值或者兜底值 */ function getDeepProperty(obj, path, defaultValue) { const pathArray = Array.isArray(path) ? path : path.split('.') let currentValue = obj for (const key of pathArray) { if (currentValue === null || currentValue === undefined) { return defaultValue } currentValue = currentValue[key] } return currentValue === undefined ? defaultValue : currentValue } // 使用示例 const level3Value = getDeepProperty(object, 'level1.level2.level3', '默认值')
这种写法没有任何语法依赖,可以兼容所有JavaScript运行环境。
内容的提问来源于stack exchange,提问作者alramdein
相关产品推荐
相关产品推荐

