为什么 undefined?.fun() 不抛出错误?

Why doesn't undefined?.fun() throw an error?

我很惊讶地看到节点 14.18.0 中的以下行为:

> {}?.fun();
Uncaught TypeError: b?.fun is not a function
> undefined?.fun();
undefined

我明白为什么第一条语句会抛出 TypeError。 {}?.funundefined,这是不可调用的。但是undefined?.fun也是undefined,为什么不抛出就可以调用呢? ECMAScript 规范的哪一部分定义了这种行为? ECMAScript 工作组是否提供了它应该以这种方式工作的任何原因?

工作的?并说可能该值未定义

通常在打字稿中这样使用

console.log(myobj?.value ?? 'does not exist');

在javascript中“?”没用

“?”什么都不做,它只是表示该值可以是未定义的,所以当你放置一个对象时,它 returns 是一个错误,因为这个 属性 在你的对象中不存在,而在未定义的 javascript 它只是忽略了一切

在可选链接期间,如果链中的当前值是 nullundefined,则表达式短路 return 值为 undefined

这是在 official docs:

The ?. operator is like the . chaining operator, except that instead of causing an error if a reference is nullish (null or undefined), the expression short-circuits with a return value of undefined. When used with function calls, it returns undefined if the given function does not exist.

因为 {} 是一个实际的对象——没有一个叫做 fun() 的方法——它爆炸了,因为你调用了一个不存在的函数。

要解决您的问题,您需要使用可选链接调用该函数:

console.log(({})?.fun?.()); // undefined