JavaScript 中存在的运算符是什么?

5
我有一个庞大的JSON对象。我需要访问x=a.b.c.d.e.f.g。但是b(或cde ...)可能未定义。该数据结构是从其他地方导入的。
是否有一种方法可以尝试将x赋值为nullundefined,而不会抛出错误?

1
有一个处于第一阶段的提案(虽然有一个Babel插件)https://github.com/tc39/proposal-optional-chaining | 另外,重复:ES6/2015中的Null-safe属性访问(和条件赋值) - yuriy636
2个回答

7

更新

可选链现在已成为ECMAScript规范的一部分,可以在大多数JavaScript客户端(浏览器、Node.js等)上使用。

x = a.b?.c?.d?.e?.f?.g

如果访问失败,您可以使用空值合并运算符(??)来使用默认值。
x = a.b?.c?.d?.e?.f?.g ?? 'my default value'

原始答案(2017年)

最简单的方法是使用try catch块。

try {
  x = a.b.c.d.e.f.g
} catch(e) {
  x = undefined;
}

有一个与此相关的提案叫做 optional chaining,你可以在这里查看:https://github.com/tc39/proposal-optional-chaining

x = a.b?.c?.d?.e?.f?.g

如果您正在使用转译器,您将能够使用它,但它仍处于非常早期的阶段,可能不会被接受支持规范。

4

有一些提议可以解决这个(缺少语法糖)问题。希望在不久的将来我们能够做到这一点:

let x = a?.b?.c?.d?.e;

然而,在那之前,如果变量未定义,我们需要退回到对象:
var x =( ( ( ( (a || {}).b || {} ) || {} ).c || {} ).d || {}).e;

我承认这很丑。也许对象解构更美观:

let ({ 
   b: { 
     c: { 
       d: { e:x } = {}
     } = {}
   } = {}
}) = a;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接