JavaScript如何无需逐层检查即可判断多层嵌套对象的属性?
问题描述
我有一个嵌套对象:
let someObject = { someKey: { otherKey: { key3: { youGetThePoint: null } } } };
如果我编写如下代码:
if (someObject.someKey.otherKey.key3.youGetThePoint) { doStuff(); }
当key3被从otherKey的对象中移除后,这个条件判断会直接报错失效。想问有没有办法不用多个&&连接或者嵌套条件来检查每一层,也就是避免写这种代码:
if (someObject && someObject.someKey && some...
可行方案
1. 使用可选链操作符(?.)
这是ES2020引入的语法,是最简洁的解决方式。它会自动检查每一层属性是否存在,只要某一层为null或undefined,整个表达式就会返回undefined,不会抛出错误:
if (someObject?.someKey?.otherKey?.key3?.youGetThePoint) { doStuff(); }
如果中间任何一层不存在,条件就不成立,不会执行doStuff(),也不会报错。
2. 用try-catch包裹判断逻辑
如果你的运行环境不支持ES2020,可以用try-catch捕获可能的错误:
try { if (someObject.someKey.otherKey.key3.youGetThePoint) { doStuff(); } } catch (e) { // 中间层不存在时进入这里,可选择什么都不做或做其他处理 }
这种方法不用写一堆判断逻辑,适合兼容旧环境的场景。
3. 封装工具函数安全获取嵌套属性
自己写一个工具函数,通过遍历属性路径来层层检查:
function getNestedProp(obj, pathArr) { return pathArr.reduce((currentObj, key) => { return currentObj?.[key]; }, obj); } // 使用示例 if (getNestedProp(someObject, ['someKey', 'otherKey', 'key3', 'youGetThePoint'])) { doStuff(); }
把需要访问的属性按层级做成数组传入函数,函数会返回最终的属性值或undefined,避免直接链式访问的报错问题。
内容的提问来源于stack exchange,提问作者B.Adler
相关产品推荐
相关产品推荐

