【问题标题】:Why doesn't undefined?.fun() throw an error?为什么 undefined?.fun() 不抛出错误?
【发布时间】:2021-11-20 13:42:13
【问题描述】:

我很惊讶在 Node 14.18.0 中看到以下行为:

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

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

【问题讨论】:

  • 因为undefined 的可选链接在undefined 处停止。由于{} 是一个实际对象——没有一个名为fun() 的方法——它会爆炸,因为你调用了一个不存在的函数。
  • ?.的全部意义在于,当左侧为undefined时,停止遍历对象图。
  • 我不确定它是如何不能以这种方式工作的——它没有调用fun,因为评估在undefined停止。
  • 我刚刚假设?. 是左关联的,就像.(即a?.b?.c <-> (a?.b)?.c)一样。没想到是短路了。
  • Short-circuiting evaluation: "当使用表达式的可选链接时,如果左操作数是nullundefined,则表达式不会被计算。" -> How much research effort is expected of Stack Overflow users?

标签: javascript specifications ecmascript-2020


【解决方案1】:

在可选链中,如果链中的当前值为nullundefined,则表达式短路,返回值为undefined

这是在official docs:

?. 运算符类似于. 链接运算符,除了如果引用是nullishnullundefined)不会导致错误,表达式短路并返回值的undefined。与函数调用一起使用时,如果给定函数不存在,则返回 undefined

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

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

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

【讨论】:

    【解决方案2】:

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

    在打字稿中通常这样使用

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

    在javascript中“?”没用的

    “?”什么都不做,它只是表示该值可以是未定义的,因此当您放置一个对象时,它会返回一个错误,因为您的对象中不存在此属性,而在未定义的 javascript 中它只是忽略所有内容

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多