使用默认值构造嵌套对象,包括节点

时间:2017-01-16 22:42:18

标签: javascript node.js ecmascript-6

使用ECMAScript 6,我可以这样写:

const {
  a = mandatory('a'),
  b: {
    c = mandatory('c'),
    d = mandatory('d')
  } = mandatory('b')
} = { a: 'a', b: { c: 'c', d: 'd' } }
console.log(a, b, c, d)

function mandatory (field) {
  throw new Error(`Not giving you a ReferenceError today, but you must set a non-falsy value to "${field}"!`)
}

mandatory是一个利用“默认语法”的函数,如果属性设置为假值,则意图抛出“已知”错误。

当我运行代码时,我得到一个ReferenceError: b is not defined。如果我删除d: 'd',它突然不再抛出错误。

... = { a: 'a', b: { c: 'c' } }

它会抛出所需的错误:

Error: Not giving you a ReferenceError today, but you must set a non-falsy value "d"!
  1. 如何定义b
  2. 如果将mandatory设置为非虚假值,如何调用a.b并抛出我自己的错误?

2 个答案:

答案 0 :(得分:0)

找到解决方案。实际上,如果mandatory具有假值,则对b函数调用没有意义。如果确实存在cd,则b将是非虚假的。

但要为进一步的处理定义b,可以这样做:

const {
  a = mandatory('a'),
  b, // Added this line
  b: {
    c = mandatory('c'),
    d = mandatory('d')
  }
} = { a: 'a', b: { c: 'c', d: 'd'} }
console.log(a, b, c, d)

function mandatory (field) {
  throw new Error(`Not giving you a ReferenceError today, but you must set "${field}"!`)
}

这不再给出参考错误。

答案 1 :(得分:0)

b未定义,因为没有这样的变量。 b:仅是分配给解构对象文字的值的属性名称,它不声明变量b。要获得一个,你需要使用两个解构步骤:

const {
  a = mandatory('a'),
  b = mandatory('b'),
} = { a: 'a', b: { c: 'c', d: 'd' } },
// or write `; const` here           ^
{
  c = mandatory('b.c'),
  d = mandatory('b.d')
} = b;
console.log(a, b, c, d);