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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:46:02