你可以将一个属性解构后,用其他名称重新命名:
在解构时使用 "as" 关键字:
const { foo: myFoo } = { foo: 'bar' } // myFoo == 'bar'
这里将 foo
解构为 myFoo
。你还可以将一个对象解构 "as" 一个解构后的对象。
const { foo: { bar } } = { foo: { bar: 'baz' } }
每个情况下只定义了一个变量,分别是myFoo
和bar
,你可以看到它们在类似的位置,除了bar
周围有{ }
。
你可以对嵌套层数进行任意数量的操作,但是如果不小心深入太多级,就会出现旧的"Cannot read properties of undefined(reading 'foo')"
错误。
const foo = { bar: { notBaz: 1 } };
const {
bar: {
baz: {
qux
}
}
} = foo;
console.log(qux);
在这种情况下,很明显我们不应该尝试解构它,因为我们可以在前一行看到
foo
的定义并没有定义属性
baz
。然而,如果对象来自API,你无法保证期望结果的每个嵌套属性都是非
null
或不是
undefined
的,你无法预先知道。
你可以通过添加
= {}
来为解构对象设置默认值:
const { foo: myFoo = 'bar' } = { baz: 'qux' };
const { bar: { baz } = {} } = { qux: 'quuz' }
你可以用深度解构来实现这个:
const foo = { bar: { notBaz: 1 } };
const {
bar: {
baz: {
qux
} = {}
} = {}
} = foo;
console.log(qux);
如果沿途有任何属性为
null
或
undefined
,它将导致返回空对象的级联,其下一级需要解构的属性将仅为
undefined
。但是在更深层次的对象中,这种格式可能需要很多行代码,使得情况变得非常复杂。这里有另一个选项,可以完成完全相同的操作。
const foo = { bar: { notBaz: 1 } };
const {qux} = foo?.bar?.baz ?? {}; // optional chaining and nullish coalescing
如果在整个过程中,
foo
、
bar
或
baz
有任何一个为null、undefined或nullish,它将返回一个空对象,你可以在
??
之后解构这个空对象。
如果你只需要提取一个属性,使用解构语法来解构
{ qux }
可能并没有太多意义,因为这样还需要添加nullish coalesced值
?? {}
。下面的写法可能更好。
const foo = { bar: { notBaz: 1 } };
const { qux, quux, quuz } = foo?.bar?.baz ?? {};
const quxFromBaz = foo?.bar?.baz?.qux;
对我个人而言,我认为在所有可选链接问题标记都包含在内时,它看起来有点凌乱,但这比在每个级别上进行嵌套解构和默认值处理的替代方案要好。并且它可以用于数组。
const foo = {
bar: [
{ a: 1 },
{ b: 2 }
]
}
const c = foo?.bar?.[2]?.c