我在Chrome控制台上进行了以下实验:

a = {}
   -> {}
a.n.n.n.n.n.n.n
   -> Uncaught TypeError: Cannot read properties of undefined (reading 'n')
a?.n.n.n.n.n.n.n
   -> Uncaught TypeError: Cannot read properties of undefined (reading 'n')
a?.n?.n.n.n.n.n.n
   -> undefined

根据我对该操作符的理解,除非所有的"点"都有前面的问号,否则我预计会出现错误:子表达式a?.n?.n应该导致未定义的结果,而后面的.n应该崩溃.然而,在做了两次?.n之后,似乎发生了一些变化,读取未定义的属性n似乎还可以,这显然是胡说八道.因此,可能还有其他事情在发生.

当对未定义的表达式求值时,您可能会认为?.是整个剩余表达式的捷径,但情况也不是这样,否则单个?.应该就足以实现这一点.

?.到底是如何表现的,这种行为如何解释我得到的结果?

推荐答案

问题引述如下:

有人可能会这么想吗?对未定义的表达式求值时,对整个剩余表达式进行快捷方式

是的,这正是正在发生的事情.从MDN人起:

可选的链接(?.)运算符访问对象的属性或调用函数.如果使用此运算符访问的对象或调用的函数未定义或为空,则表达式short circuits AND的计算结果为未定义,而不是引发错误.

当您访问a.b.ca?.b.c

  • a的计算结果为空对象
  • a.b的计算结果为未定义
  • a.b.c会引发错误,因为您正在从UnDefined访问c属性.

请注意,这里不需要在a之后添加?.,因为a不是空的.

但是,如果是a?.b?.c.da.b?.c.d

  • 与前面一样,a的计算结果为对象,而a?.b的计算结果为未定义.
  • 计算a?.b?.c时:由于a.b未定义,因此它不访问c属性并在此处短路,并为整个表达式返回未定义的值

Javascript相关问答推荐

react 页面更改类别时如何返回第0页

我的YouTube视频没有以html形式显示,以获取免费加密信号

无法将nPM simplex-noise包导入在JS项目中工作

React Native平面列表自动滚动

materialized - activeIndex返回-1

当在select中 Select 选项时,我必须禁用不匹配的 Select

窗口.getComputedStyle()在MutationObserver中不起作用

点击按钮一次有文本出现和褪色,而不是点击两次?(html,CSS,JavaScript)

更改JSON中使用AJAX返回的图像的路径

处理时间和字符串时MySQL表中显示的日期无效

如何在输入元素中附加一个属性为checkbox?

如何在.NET Core中将chtml文件链接到Java脚本文件?

如何使用JS创建一个明暗功能按钮?

Nextjs 13.4 Next-Auth 4.2登录(&Quot;凭据&,{});不工作

SPAN不会在点击时关闭模式,尽管它们可以发送日志(log)等

未捕获的运行时错误:调度程序为空

当从其他文件创建类实例时,为什么工作线程不工作?

图表4-堆叠线和条形图之间的填充区域

Next.js无法从外部本地主机获取图像

通过解构/功能组件接收props-prop验证中缺少错误"