You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,此时访问长度属性也会抛出错误。
修复方案
  1. 替换所有length(xxx)写法为xxx.length
  2. 传递参数时做两层浅拷贝,避免内外层数组引用共享
  3. 在check函数开头增加空数组判断,避免边界异常
  4. 每次调用完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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:54:02