JS编写打印size*size正方形矩阵函数执行报错问题排查
JS正方形星号矩阵代码报错问题排查
原代码核心报错原因
- 语法认知偏差:JavaScript 不支持 C/Java 这类语言中的
数组名[长度1][长度2]静态数组声明语法。原代码中let mat = [size][size];的实际执行逻辑和预期完全不符:代码会先创建一个空数组字面量[],随后访问这个空数组下标为size的元素(空数组无对应下标,取值结果为undefined),最后试图对这个undefined的size下标属性做赋值操作,直接触发Cannot set properties of undefined类型报错 - 冗余越界逻辑:内层j循环执行完成后,代码额外编写了
mat[i][j] = '*';的赋值语句,此时j的值已经跳出循环条件、等于size,对应下标早已超出数组合法范围,属于无意义的冗余代码 - 功能设计偏离:函数命名为矩阵打印,但原代码仅实现返回二维数组的逻辑,没有实际的控制台打印输出能力
修正后的可运行实现
function printSquareMatrix(size) { // 入参合法性校验 if (typeof size !== 'number' || size <= 0 || !Number.isInteger(size)) { throw new Error('size参数必须传入正整数'); } // 正确初始化size行size列的二维数组结构 const mat = Array.from({ length: size }, () => new Array(size)); for (let i = 0; i < size; i++) { for (let j = 0; j < size; j++) { mat[i][j] = '*'; } // 打印当前行的矩阵内容 console.log(mat[i].join(' ')); } // 如需返回矩阵结构可直接返回 return mat; } // 测试调用 printSquareMatrix(3)
修正要点
- 替换错误的初始化语法:用
Array.from动态生成二维数组,保证mat是真正具备size行、每行size个元素的二维结构 - 简化循环边界条件:将原来容易写错的
i <= size - 1、j <= size -1替换为语义更清晰的i < size、j < size,避免边界值计算失误 - 删除越界冗余赋值逻辑,减少无意义的运行时操作
- 补充入参校验,避免传入非正整数时触发无限循环或异常
- 补充实际打印逻辑:每行填充完成后拼接成连续字符串输出,真正实现正方形矩阵的打印效果
内容的提问来源于stack exchange,提问作者Y.Ivanov
相关产品推荐
相关产品推荐

