JavaScript中将数组作为函数参数传递后清空原数组报错如何解决
问题核心原因
- 语法错误:JS 中获取数组长度是访问
.length属性,而非调用length()函数,你代码中length(validate[0])的写法会直接抛出「length 未定义」错误,这是触发报错的最直接原因。 - 引用类型传参误区:JS 中数组属于引用类型,直接将
val作为参数传入check时,函数内的validate和外部的val指向同一块内存地址,如果在check执行完成前清空val,会导致函数内部拿到的数组内容异常。另外你尝试用slice()做拷贝属于浅拷贝,只能拷贝外层数组,val是二维数组,内层的子数组依然是共享引用,check中对validate[i]的splice操作依然会修改原数组中的子数组。 - 边界判断缺失:如果
val为空时传入check,validate[0]会返回undefined,此时访问长度属性也会抛出错误。
修复方案
- 替换所有
length(xxx)写法为xxx.length - 传递参数时做两层浅拷贝,避免内外层数组引用共享
- 在
check函数开头增加空数组判断,避免边界异常 - 每次调用完
check后再清空val,避免影响当前次函数执行
修改后的代码
let val = []; let hLines = [] function compare() { for (let i = 0; i < 8; i++) { val = [] // 每次外层循环重置val for (let j = 0; j < sortY[i].length; j++) { for (let k = 0; k < sortX.length; k++) { for (let l = 0; l < sortX[k].length; l++) { if (sortY[i][j] == sortX[k][l] && !val.includes(sortX[k])) { val.push(sortX[k]) } } } if (j === sortY[i].length - 1) { // 做两层浅拷贝,避免check修改原数组 let copy = val.map(item => [...item]) check(sortY[i], copy) val = [] // 调用完成后清空val } } } } compare() function check(hLine, validate) { // 空数组直接返回,避免后续报错 if (!validate || validate.length === 0) return for (let i = 0; i < validate.length; i++) { for (let j = 0; j < validate[i].length; j++) { let first = validate[i][0]; let last = validate[i][validate[i].length - 1]; if (validate[i][j] != first && validate[i][j] != last) { validate[i].splice(j, 1) j-- } } } let lengthValue = validate[0].length let lengthCheck = validate.every((v, i) => { return v.length === lengthValue }) if (!lengthCheck) { hLines.push(hLine) } } console.log(hLines)
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

