开发者问题收集

在 JavaScript 中安全地从对象中提取属性

2020-01-23
194

我有这个函数:

const someVar = someOtherVar.pipe(
        // filter((data) => data && !data.loading)   // Works
        filter(({ loading }) => !loading),  // Doesn't work if data is Null
);

现在,正如注释中提到的,注释的代码在每种情况下都有效,但我想让它以第二种方式工作。可能存在数据为空的情况。所以,我会得到这个错误

TypeError: Cannot read property 'loading' of null

有没有办法安全地解构 JavaScript 对象?

2个回答

这里有几个选项可以使其与第二个选项一起工作。

filter(x => x).filter(({ loading }) => !loading)

map(x => x || {}).filter(({ loading }) => !loading)

这两个选项可能不如您注释的代码那么高效,但它们可能会提高可读性。

Siva Kondapi V
2020-01-23

null 不是对象,这就是为什么您无法安全地解构它 :-) 不,您不能在这里使用解构。

最接近有用的语法特征是来自 可选链 提案 data => !data?.loading ,但这相当于 !(data && data.loading) 而不是 data && !data.loading

Bergi
2020-01-23