JS中对对象取值使用OR运算符出现TypeError报错如何解决?
报错产生原因
||(OR运算符)仅会对其左右两侧的表达式最终返回值做假值判断和回退处理,不会处理左侧表达式执行过程中抛出的错误。
你当前代码的执行逻辑是先依次读取err.errors → email → message属性,再对最终的message值做|| null的回退判断。如果中间某一层属性不存在(比如err.errors下没有email字段,email的值为undefined),此时直接访问undefined.message会立即抛出TypeError,根本不会执行到后续的|| null逻辑。
正确处理方案
方案1:使用可选链 + 空值合并运算符(ES2020及以上环境推荐,写法最简洁)
可选链?.会在读取到某一层属性为undefined/null时直接终止读取,返回undefined而不抛出错误,搭配空值合并运算符??实现回退:
if(err){ res.status(403).json({ emailErr: err.errors?.email?.message ?? null, userErr: err.errors?.username?.message ?? null, }); }
如果不需要保留空字符串、0等合法假值,也可以替换为|| null,即:emailErr: err.errors?.email?.message || null
方案2:分层判断兼容低版本ES环境
如果运行环境不支持ES2020新特性,可以用&&运算符逐层做属性存在性判断,再搭配||做回退:
if(err){ const errors = err.errors || {}; res.status(403).json({ emailErr: (errors.email && errors.email.message) || null, userErr: (errors.username && errors.username.message) || null, }); }
&&运算符的短路逻辑会保证只有左侧值为真时才会执行右侧的属性读取操作,避免访问undefined的属性抛出错误。
内容的提问来源于stack exchange,提问作者luke3359767
相关产品推荐
相关产品推荐

