JavaScript静态方法传递矩阵报错:Cannot set properties of undefined
Matrix类静态transpose方法报错问题解决
我跟着Daniel Shiffman的神经网络教程写代码时,调用Matrix类的静态transpose方法并传入已创建的矩阵,出现了错误:
Uncaught (in promise) TypeError: Cannot set properties of undefined (setting '0')
错误源自代码行 result.data[j][i] = matrix.data[i][j]。我尝试在方法内创建测试矩阵,仍报同样的undefined相关错误。作为JS新手,我怀疑是值/引用传递和Java不同,但始终无法解决。
报错的transpose方法代码
static transpose(matrix) { let result = new Matrix(this.cols, this.rows); for (let i = 0; i < matrix.rows; i++) { for (let j = 0; j < matrix.cols; j++) { result.data[j][i] = matrix.data[i][j]; } } return result; }
测试用的transpose方法代码
static transpose(matrix) { let test = new Matrix(2,2); let result = new Matrix(this.cols, this.rows); for (let i = 0; i < matrix.rows; i++) { for (let j = 0; j < matrix.cols; j++) { result.data[j][i] = test.data[i][j]; } } return result; }
问题根源与修复
核心问题是静态方法里用this访问cols和rows完全错误。JS的静态方法中,this指向的是类本身,而非传入的matrix实例。所以this.cols和this.rows都是undefined,导致创建的result矩阵结构异常,访问result.data[j][i]时自然会触发undefined错误。
正确逻辑是:转置矩阵的行数等于原矩阵的列数,列数等于原矩阵的行数。创建result时要传入matrix.cols和matrix.rows,而非this.cols和this.rows。
修复后的代码:
static transpose(matrix) { // 转置后的矩阵行数=原矩阵列数,列数=原矩阵行数 let result = new Matrix(matrix.cols, matrix.rows); for (let i = 0; i < matrix.rows; i++) { for (let j = 0; j < matrix.cols; j++) { result.data[j][i] = matrix.data[i][j]; } } return result; }
补充说明
JS的静态方法和Java逻辑类似,属于类的方法而非实例方法。调用静态方法时不会绑定到某个实例,因此this在静态方法里指向类本身,不是你传入的matrix对象。这和值/引用传递无关,纯粹是静态方法中this的使用错误。
内容的提问来源于stack exchange,提问作者merkkupilot
相关产品推荐
相关产品推荐

