JS代码报TypeError: Cannot read property 'forEach' of null如何解决
报错原因
- 报错的直接原因是你调用
forEach方法的array2变量值为null,null不存在forEach方法,所以抛出类型错误 - 你的边界校验逻辑完全失效:数组的
length属性是数字类型,永远不可能等于null,所以你写的if (array1.length === null && array2.length === null) return false;永远不会触发。如果入参直接传入null作为array1或array2,访问.length本身就会先报错,更不会走到你写的判断逻辑里 - 额外逻辑缺陷:你没有判断两个数组长度是否相等,如果array2长度和array1不一致,你的校验逻辑结果会不准确,比如array2元素更多的场景下,你遍历完array2之后array1长度也可能为0,但实际array2有多余元素没有校验
修复代码
let comp = (array1, array2) => { // 先校验两个入参是不是都是有效数组 if (!Array.isArray(array1) || !Array.isArray(array2)) return false; // 长度不一致直接返回false,减少不必要遍历 if (array1.length !== array2.length) return false; // 拷贝原数组,避免修改传入的外部数组 const arr1Copy = [...array1]; for (const val of array2) { const sqrtVal = Math.sqrt(val); const index = arr1Copy.indexOf(sqrtVal); if (index === -1) return false; arr1Copy.splice(index, 1); } return arr1Copy.length === 0; }
修复说明
- 新增入参类型校验,先判断两个入参是不是数组类型,避免null/undefined/其他类型传入时触发报错
- 新增长度校验,长度不相等直接返回false,提升执行效率
- 拷贝array1再做删除操作,避免修改外部传入的原数组,符合纯函数的设计规范
- 把重复计算的
Math.sqrt(val)存为变量,减少不必要的重复计算 - 提前终止循环:如果array2中存在找不到对应平方根的元素,直接返回false,不用继续遍历剩下的元素
内容的提问来源于stack exchange,提问作者Everything About Coding
相关产品推荐
相关产品推荐

