JS/ES6:未定义的解构

IT技术 javascript ecmascript-6
2021-02-06 05:32:14

我正在使用一些这样的解构:

const { item } = content
console.log(item)

但是我应该如何处理content === undefined- 这会引发错误?

“旧”方式如下所示:

const item = content && content.item

因此,如果content未定义 ->item也将是未定义的。

我可以使用解构做类似的事情吗?

6个回答

您可以使用短路评估来提供默认值 if contentis a falsy value,通常undefinednull在这种情况下。

const content = undefined
const { item } = content || {}
console.log(item)                       // undefined

一种不太惯用的方法(请参阅此评论)是在解构之前将内容传播到对象中,因为nullundefineds值被忽略

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"

(我们使用for of它是因为它比 读起来更好,工作得更好.forEach,但它们在今天的引擎中具有相同的速度)。感觉很单调,因为它只是……在我眼里看起来很奇怪。{ ...content }被称为“制作”的浅拷贝content,而不是“......或未定义时的空对象”的习语
2021-04-01 05:32:14
您还可以在解构它之前将内容传播到一个对象中” - 这对我来说似乎非常低效和单调
2021-04-03 05:32:14
我认为它是传播的潜在用途。它的可读性不如短路,但它是工具箱中的另一个工具。
2021-04-11 05:32:14
@Bergi - 我不会争论效率,因为它取决于你用它做什么。for 循环比 forEach 更有效,但我们仍然使用后者,除非我们需要每一盎司的性能。为什么unidiomatic在你看来?
2021-04-13 05:32:14
const { item } = Object(content)
@httpete 看起来它正在创建一个新对象,如果content为 null 或未定义,您只会返回一个空对象。
2021-03-31 05:32:14
为了清楚起见,你能解释一下吗?它确实很好用。
2021-04-06 05:32:14

解构嵌套对象是干净和简短的,但是当源属性是nullundefined在右侧对象中时很糟糕

假设我们有

const {
  loading,
  data: { getPosts },
} = useQuery(FETCH_POSTS_QUERY);

解决方案 1 如果我们有数据对象但没有getPosts那么我们可以使用:(
在每个级别设置默认值)

const {
  loading,
  data: { getPosts = [] } = { getPosts: [] },
} = useQuery(FETCH_POSTS_QUERY);

解决方案 2: 如果事件dataundefined

const {
  loading,
  data: { getPosts } = { getPosts: [] },
} = useQuery(FETCH_POSTS_QUERY);

接受的答案不适用于未设置的真正未定义的值const content = undefined在这种情况下,这将起作用:

const { item } = (typeof content !== 'undefined' && content) || {}
console.log(item)
“真正未定义的值”是什么意思?
2021-03-18 05:32:14
@Bergi 我相信他们在谈论 un_declared_ 变量与具有undefined. content未声明或在范围内的开发控制台中测试上述代码将起作用,但将分配替换为content || {}引发Uncaught ReferenceError: content is not defined异常。
2021-03-24 05:32:14

可以解包 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}
    });
})()