一个因为解构赋值引发的bug血案

75 阅读2分钟

今天在开发项目的过程中,突然发现一个莫名奇妙的bug,关键是这个bug从调用的信息栈中看不出任何的组件相关的信息,报错的信息类似于下面这个

报错:Cannot destructure property '0' of 'null' as it is null.

image.png

后来在一段代码中发现了类似这样的代码片段

    render:function(__,item){
        let [num] = str?.split("|") // 出错代码就在这里!!!
    }

这段代码实在框架里面渲染一个组件,问题就出现在解构赋值这里,因为str split加上可选链之后结果可能返回undefined,在JavaScript中,使用数组解构赋值时若右侧为undefined会直接报错,因为解构赋值要求右侧必须是可迭代的对象(如数组或类数组对象)。以下是具体分析及解决方案:


​问题分析​

let [num] = null; // 报错:Cannot destructure property '0' of 'null' as it is null.
  • ​原因​​:null不是可迭代对象,无法进行解构赋值。

  • ​对比示例​​:

    let [num] = undefined; // 报错:Cannot destructure property '0' of 'undefined' as it is undefined.
    let [num] = [];        // 正常:num = undefined(未赋值时默认undefined)
    

​解决方案​

1. ​​提供默认值​

通过逻辑或运算符||为右侧提供空数组作为默认值:

let [num] = null || []; // 使用空数组作为默认值
console.log(num); // 输出:undefined

2. ​​显式检查null

在解构前判断右侧是否为null

let data = getData(); // 假设可能返回null
let [num] = data !== null ? data : [];

3. ​​结合可选链操作符(?.)​

若数据可能为nullundefined,可用可选链简化逻辑:

let [num] = data?.[0] ?? [];

​关键区别​

场景结果说明
let [num] = null报错无法解构null
let [num] = []num = undefined空数组解构时元素为undefined
let [num = 0] = []num = 0设置默认值避免undefined

​总结​

  • ​避免直接解构null​:确保右侧为数组或通过逻辑运算符提供默认值。
  • ​默认值生效条件​​:仅在解构目标为undefined时生效,若为null需手动处理。
  • ​推荐实践​​:结合||或空数组默认值,增强代码健壮性。