我有一个这样的物体
const obj = {
foo: {
bar: { // maybe null
id: 0
}
}
};
我想破坏obj
以获得id
。如果bar
仅是undefined
或某个对象,那就足够了:
const {
foo: {
bar: {
id,
} = {},
} = {},
} = obj;
但是当bar
为null
时,我得到了错误Cannot read property 'id' of null
。
我可以这样做,suggested here
const {
foo: {
bar = {},
} = {},
} = obj;
const { id } = bar || {};
但这意味着我需要将每个可为空的对象分解为一个单独的语句,我不希望这样做。
是否可以使对象的默认初始化程序在其值为null时运行?
答案 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
,因此,您可以将其扩展为具有另一个空对象,以链接所需的下一个内部属性访问。