JavaScript二维数组P0、P1在while循环内为undefined循环外为0原因排查
问题原因分析
二维数组访问/赋值语法错误
你代码中所有P0[z, r]、P1[i, j]这类写法不符合JavaScript语法规则。方括号内的逗号是逗号运算符,仅会返回最后一个表达式的值,比如P0[z, r]等价于P0[r],你实际拿到的不是二维数组对应行列的元素,而是P0数组下标为r的元素,取值、赋值逻辑完全错误。正确的二维数组访问写法为P0[z][r]、P1[i][j]。数组越界访问
你通过Create2DArray(N)生成的P0、P1数组,行数为N(下标范围0N-1),每行的列数为N+1(下标范围0N)。但代码中多次出现P0[i+1][j]、P0[i][j+1]这类访问操作,当i=N-1时i+1=N超出行下标最大范围,后续边界赋值循环你还用到了z <= N+1,访问P1[N]、P1[N+1]本身就是不存在的undefined值,赋值逻辑完全无效。变量未初始化问题
你对U和V的判断用了互斥的if...else if结构,只要U不等于0,就永远不会走到V的判断分支,导致M3、M4未被赋值为undefined,后续计算S3时使用未定义变量,结果自然为NaN或undefined,赋值给P1元素后就会出现异常值。
修复建议
- 将所有
P0[a,b]、P1[a,b]的写法全部替换为P0[a][b]、P1[a][b] - 调整边界判断避免数组越界,可将二维数组的创建尺寸适当放大,或者将i、j的循环上限调整为N-2,避免访问i+1、j+1时超出数组下标范围
- 将U和V的判断从互斥的
else if改为独立的if,两个变量的判断分开执行,保证M1、M2、M3、M4都能被正确初始化 - 边界赋值的循环范围调整到数组实际的下标范围内,不要超出数组本身的长度
内容的提问来源于stack exchange,提问作者Александр Плетнев
相关产品推荐
相关产品推荐

