使用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"!
b
?mandatory
设置为非虚假值,如何调用a.b
并抛出我自己的错误?答案 0 :(得分:0)
找到解决方案。实际上,如果mandatory
具有假值,则对b
函数调用没有意义。如果确实存在c
或d
,则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);