JavaScript可选链接(?)操作符是如何工作的?

JavaScript可选链接(?)操作符是如何工作的?,javascript,ecmascript-next,optional-chaining,Javascript,Ecmascript Next,Optional Chaining,我正在研究新的JS可选链接操作符。它帮助我们避免出现这样的错误 TypeError: Cannot read property ‘x’ of undefined console.log(obj.b.c.d?.e); 你可以写 const obj = {a: 1}; console.log(obj?.b); 没有错误。如果obj对象中没有名为b的属性,它将返回undefined。现在,这适用于第一级(.)操作员。但是如果我尝试这样的事情 TypeError: Cannot read prop

我正在研究新的JS可选链接操作符。它帮助我们避免出现这样的错误

TypeError: Cannot read property ‘x’ of undefined
console.log(obj.b.c.d?.e);
你可以写

const obj = {a: 1};
console.log(obj?.b);
没有错误。如果
obj
对象中没有名为
b
的属性,它将返回
undefined
。现在,这适用于第一级(.)操作员。但是如果我尝试这样的事情

TypeError: Cannot read property ‘x’ of undefined
console.log(obj.b.c.d?.e);
这是一个错误

Uncaught TypeError: obj.c is undefined // In firefox it throws obj.b is undefined.
但是如果我写

console.log(obj.b?.c.d?.e);
它再次返回未定义。它是否应该返回未捕获的类型错误:obj.b.c未定义

这是实施上的差距还是我遗漏了什么?提前谢谢

现在已经解决了@伊法鲁基的评论有恰当的解释


更新:它被称为“链接”操作符。它从左向右移动。如果它看到了?。如果左值未定义,则检查左值。如果是,则返回undefined并停止向右移动。这意味着如果b已经未定义,它将不会检查右侧的值。在下面的示例中,obj只有一个键a

const obj = {a: 1};
console.log(obj?.b);
在上面的代码段中,对象中没有属性b,因为它正在打印未定义的属性

console.log(obj.b.c.d?.e);
console.log(obj.b?.c.d?.e);
即使在上面的代码中,如果对象没有键b,也会发生同样的情况,因此它正在打印未定义的内容。因此,如果您希望看到obj.b.c未定义,则对象应如下所示:

obj: {
    b: '123'
}

它被称为“链接”操作符。它从左向右移动。如果它看到
?。
如果它的
未定义,它将检查左边的值。如果是,则返回
未定义
,并停止向右移动。这意味着如果
b
已经
未定义
它将不会检查右侧的值

它称为“链接”操作符。它从左向右移动。如果它看到
?。
它将检查左侧值(如果未定义)。如果是,则返回undefined并停止向右移动。这意味着如果
b
已经未定义,它将不会检查右侧的值“如果
obj
对象中没有名为
b
的属性,它将返回
undefined
”。它更像是:“如果对象
obj
本身是
null
未定义的
,或者如果对象
obj
存在但没有属性
b
,它将返回
undefined
。”“
?。
运算符的功能类似于
链接运算符,不同的是,如果引用是
null
ish(
null
undefined
),表达式会短路,返回值为
undefined
。“谢谢大家@在第一个和第二个示例中,可选的链接操作符与常规属性访问器没有区别
obj?.b
只是读取
b
(这是
未定义的
),因为
obj
不是空值。