为什么undefined?.fun()调用不报错,而{}?.fun()会抛出TypeError?
可选链调用行为差异解释
这两种写法的运行结果差异,核心原因是可选链?.的短路触发时机不同,和后续属性读取返回的是不是undefined没有关联:
{}?.fun()的报错逻辑{}属于非null、非undefined的正常值,不会触发可选链的短路规则,会正常执行.fun属性读取操作。普通空对象自身和原型链上都没有fun属性,读取结果为undefined,接下来执行()调用操作时,本质就是尝试调用undefined这个非函数类型的值,自然会抛出TypeError。undefined?.fun()的返回逻辑
可选链最左侧的根值本身就是undefined,直接触发短路规则,后续的.fun属性读取、()调用操作全程都不会执行,整个表达式直接返回undefined,根本不会走到“调用undefined”的步骤,所以不会报错。
规范依据
该行为由ECMAScript标准中OptionalExpression的运算流程明确定义:当可选链的左侧根表达式求值结果为null或undefined时,整个可选链表达式直接返回undefined,后续所有的属性访问、函数调用、下标索引操作都会被跳过,不会执行。
设计原因
TC39(ECMAScript技术委员会)在设计可选链特性时,核心目标就是简化开发者处理null/undefined判空的冗余代码,替代之前obj && obj.func && obj.func()这类冗长的前置判断。短路逻辑完全贴合这个设计目标:当开发者使用可选链时,默认语义就是“如果根对象不存在,后续操作没有执行意义”,自然不需要再执行后续操作抛出额外错误,符合绝大多数开发者的使用预期。
内容的提问来源于stack exchange,提问作者OpenAI was the last straw
相关产品推荐
相关产品推荐

