变量未定义是否会抛出异常?可选链优化代码合理性咨询
问题解答
1. 原代码的throw分支执行问题
你给出的第一段代码:if (e.message.indexOf('x') !== -1) { console.log('Error') } else { throw e }
如果e或e.message为undefined,完全不会走到else的throw分支。
因为JavaScript访问未定义变量/属性时会直接抛出运行时TypeError:如果e本身是undefined,执行e.message就会直接报错中断代码;如果e存在但e.message是undefined,调用undefined.indexOf()同样会直接抛错,两种情况都不会进入if判断的逻辑分支,你写的throw e永远不会在这两种场景下触发。
2. 可选链优化写法的合理性
优化后的写法:if (e?.message?.indexOf('x') !== -1) { console.log('Error') } else { throw e }
是更合理的实现,完全符合预期逻辑:
可选链?.会在访问链路中遇到null/undefined时直接返回undefined,不会抛出运行时错误。此时判断条件e?.message?.indexOf('x') !== -1的计算结果为undefined !== -1,值为false,会正常进入else分支执行throw e,覆盖了e或e.message未定义的边界场景。
内容的提问来源于stack exchange,提问作者Charles Brown
相关产品推荐
相关产品推荐

