我正在使用这样的解构:
const { item } = content
console.log(item)
但是我应该如何处理content === undefined
- 哪会引发错误?
'旧'的方式如下:
const item = content && content.item
因此,如果未定义content
- > item
也未定义。
我可以使用解构来做类似的事吗?
答案 0 :(得分:35)
如果content
是假值,您可以使用short circuit evaluation提供默认值,在这种情况下通常为undefined
或null
。
const content = undefined
const { item } = content || {}
console.log(item) // undefined
较少惯用(see this comment)方式是在解构之前将内容传播到对象中,因为null
and undefineds
values are ignored。
const content = undefined
const { item } = { ...content }
console.log(item) // undefined
如果您正在解构函数参数,则可以提供默认值(示例中为= {}
)。
注意:只有在解构后的参数为undefined
时才会应用默认值,这意味着解构null
值会引发错误。
const getItem = ({ item } = {}) => item
console.log(getItem({ item: "thing" })) // "thing"
console.log(getItem()) // undefined
try {
getItem(null)
} catch(e) {
console.log(e.message) // Error - Cannot destructure property `item` of 'undefined' or 'null'.
}
如果输入对象不包含属性,甚至可以为item
属性设置默认值
const getItem = ({ item = "default" } = {}) => item
console.log(getItem({ item: "thing" })) // "thing"
console.log(getItem({ foo: "bar" })) // "default"
答案 1 :(得分:0)
可接受的答案不适用于const content = undefined
未设置的真正不确定的值。在这种情况下,它将起作用:
const { item } = (typeof content !== 'undefined' && content) || {}
console.log(item)
答案 2 :(得分:0)
const { item } = Object(content)
答案 3 :(得分:0)
对于 OP 的用例,我将补充一点,也可以使用 Optional chaining operator:
const item = content?.item
console.log(item)
如果 content
是 null 或 undefined,那么 content.item
将不会被访问,item
将是 undefined .
答案 4 :(得分:0)
可以解包 undefined 值,但不能解包 undefined。
修复它就像设置默认参数值一样简单。
(() => {
// prepare payload
const PAYLOAD = {
holdingJustThis: 1
};
// lets unpack the payload and more
const {
holdingJustThis,
itIsGoingToBeUndefined,
itCouldThrowButWont: {
deep
} = {} // this will secure unpacking "deep"
} = PAYLOAD;
console.log({
holdingJustThis
});
console.log({
itIsGoingToBeUndefined // logs {itIsGoingToBeUndefined:undefined}
});
console.log({
deep // logs {deep:undefined}
});
})()