为什么 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。 {}?.fun
是 undefined
,这是不可调用的。但是undefined?.fun
也是undefined
,为什么不抛出就可以调用呢? ECMAScript 规范的哪一部分定义了这种行为? ECMAScript 工作组是否提供了它应该以这种方式工作的任何原因?
工作的?并说可能该值未定义
通常在打字稿中这样使用
console.log(myobj?.value ?? 'does not exist');
在javascript中“?”没用
“?”什么都不做,它只是表示该值可以是未定义的,所以当你放置一个对象时,它 returns 是一个错误,因为这个 属性 在你的对象中不存在,而在未定义的 javascript 它只是忽略了一切
在可选链接期间,如果链中的当前值是 null
或 undefined
,则表达式短路 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
我很惊讶地看到节点 14.18.0 中的以下行为:
> {}?.fun();
Uncaught TypeError: b?.fun is not a function
> undefined?.fun();
undefined
我明白为什么第一条语句会抛出 TypeError。 {}?.fun
是 undefined
,这是不可调用的。但是undefined?.fun
也是undefined
,为什么不抛出就可以调用呢? ECMAScript 规范的哪一部分定义了这种行为? ECMAScript 工作组是否提供了它应该以这种方式工作的任何原因?
工作的?并说可能该值未定义
通常在打字稿中这样使用
console.log(myobj?.value ?? 'does not exist');
在javascript中“?”没用
“?”什么都不做,它只是表示该值可以是未定义的,所以当你放置一个对象时,它 returns 是一个错误,因为这个 属性 在你的对象中不存在,而在未定义的 javascript 它只是忽略了一切
在可选链接期间,如果链中的当前值是 null
或 undefined
,则表达式短路 return 值为 undefined
。
这是在 official docs:
The
?.
operator is like the.
chaining operator, except that instead of causing an error if a reference isnullish
(null
orundefined
), the expression short-circuits with a return value ofundefined
. When used with function calls, it returnsundefined
if the given function does not exist.
因为 {}
是一个实际的对象——没有一个叫做 fun()
的方法——它爆炸了,因为你调用了一个不存在的函数。
要解决您的问题,您需要使用可选链接调用该函数:
console.log(({})?.fun?.()); // undefined