4

我有一个大的 json 对象。我需要访问x = a.b.c.d.e.f.g. 但是b(或c, d, e...) 可以是未定义的。这个数据结构是从其他地方导入的。

有没有办法尝试在xnullundefined没有抛出错误的情况下进行分配?

4

2 回答 2

7

更新

可选链现在是 ECMAScript 规范的一部分,可以在大多数 javascript 客户端(浏览器、node.js 等)上使用

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

要在访问失败时使用默认值,您可以使用Nullish 合并运算符 (??)

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

如果您使用的是转译器,您将能够使用它,但它仍处于早期阶段,可能不被接受在规范中得到支持

于 2017-08-31T20:16:42.917 回答
4

有一些建议可以解决这个(语法糖缺失)问题。希望有一天我们可以这样做:

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

但是,在那之前,如果变量未定义,我们需要回退到对象:

var x =( ( ( ( (a || {}).b || {} ) || {} ).c || {} ).d || {}).e;

我承认这很丑陋。也许对象解构更漂亮:

let ({ 
   b: { 
     c: { 
       d: { e:x } = {}
     } = {}
   } = {}
}) = a;
于 2017-08-31T20:20:37.700 回答