-1

我正在研究新的 JS 可选链接?.运算符。它可以帮助我们避免出现这样的错误,

TypeError: Cannot read property ‘x’ of undefined

你可以写

const obj = {a: 1};
console.log(obj?.b);

没有错误。如果对象中undefined没有命名属性,它将返回。现在,这适用于 (.) 运算符的第一级。但如果我尝试这样的事情,bobj

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);

它再次返回未定义。不应该回来Uncaught TypeError: obj.b.c is undefined吗?

这是一些实施差距还是我在这里遗漏了什么?提前致谢。

现在已经解决了。@Ifaruki 的评论有正确的解释。

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

4

2 回答 2

3

它被称为“链接”运算符。它从左向右移动。如果它看到?.它检查左值,如果它的undefined. 如果是,它会返回undefined并停止向右移动。这意味着如果b已经是undefined它不会检查右侧的值

于 2020-10-28T13:45:20.897 回答
1

在下面的示例中,obj 只有一个键 a。

const obj = {a: 1};
console.log(obj?.b);

在上面的代码片段中,对象中没有属性 b 因为它正在打印undefined

console.log(obj.b.c.d?.e);
console.log(obj.b?.c.d?.e);

即使在上面的代码中,在对象没有键b的情况下也会发生同样的事情,因此它打印的是未定义的。因此,如果您想查看 obj.bc 未定义,则该对象应如下所示:

obj: {
    b: '123'
}
于 2020-10-28T13:40:19.557 回答