解构时可空嵌套对象上的ES6默认参数

时间:2019-03-01 20:01:27

标签: ecmascript-6 nested destructuring default-parameters spread-syntax

我有一个这样的物体

const obj = {
  foo: {
    bar: { // maybe null
      id: 0
    }
  }
};

我想破坏obj以获得id。如果bar仅是undefined或某个对象,那就足够了:

const {
        foo: {
          bar: {
            id,
          } = {},
        } = {},
      } = obj;

但是当barnull时,我得到了错误Cannot read property 'id' of null

我可以这样做,suggested here

const {
        foo: {
          bar = {},
        } = {},
      }      = obj;
const { id } = bar || {};

但这意味着我需要将每个可为空的对象分解为一个单独的语句,我不希望这样做。

是否可以使对象的默认初始化程序在其值为null时运行?

1 个答案:

答案 0 :(得分:1)

您可以对传播操作员进行“劫持”。您将拥有不太好的语法,但它可以工作:

const obj = {
  foo: {
    bar: null
  }
}

const id = {...{...{...obj}.foo}.bar}.id
// id = undefined

You can add an "or something" to the end to get a default value, like:
const id = {...{...{...obj}.foo}.bar}.id || 42
// id = 42

此方法的原理是,如果您尝试传播未定义或null值,则会得到一个空对象:

console.log('spreaded null', { ...null })
// {}

console.log('spreaded undefined', { ...undefined })
// {}

现在,如果您访问未在对象上定义的属性,则JS引擎将返回您undefined,因此,您可以将其扩展为具有另一个空对象,以链接所需的下一个内部属性访问。