JavaScript:很难诊断错误



我正试图学习一些JavaScript,但我被一个特殊的问题卡住了:

此函数应创建一个预先填充有零的二维数组。输出看起来是正确的,但有一个错误。解释错误并修复。

function defaultMatrix(size) { // returns array
var defaultValue = 0;
var row = [];
var matrix = [];
for (var i = 0; i < size; i++) {
row.push(defaultValue);
}
for (var i = 0; i < size; i++) {
matrix.push(row);
}
console.log(matrix);
return matrix;
}
defaultMatrix(4);

JSFiddle链接

在这个片段中,它肯定按预期运行;调用defaultMatrix((将在web控制台中显示一个充满零的2D矩阵。

我无法理解的是这个代码据称存在的"bug">它是什么?我应该如何修复它

在代码段中,它肯定会按预期运行。。。

不,不是。:-(您正在重复使用相同的阵列size次。您需要创建size数组,请参阅***注释:

function defaultMatrix(size) { // returns array
var defaultValue = 0;
var row = [];
var matrix = [];
for (var i = 0; i < size; i++) {
row.push(defaultValue);
}
for (var i = 0; i < size; i++) {
matrix.push([...row]); // *** *Copy* the row
}
console.log(matrix);
return matrix;
}
defaultMatrix(4);
.as-console-wrapper {
max-height: 100% !important;
}

如果您需要在没有ES2015+支持的情况下支持较旧的环境,这是:

matrix.push([...row]); // *** *Copy* the row

应该是:

matrix.push(row.slice()); // *** *Copy* the row

我想你想要这样的东西:

function MatrixMaker(rows, cols = null){
this.matrix = []; this.rows = rows;
this.cols = cols === null ? rows : cols;
this.init = ()=>{
this.matrix.splice(0);
for(let i=0,a,l=this.rows; i<l; i++){
a = []; this.matrix.push(a);
for(let n=0,c=this.cols; n<c; n++){
a.push(0);
}
}
return this;
}
this.init();
}
const mm = new MatrixMaker(4);
console.log(mm.matrix);

我还没有添加行和列的getter和setter。这对你来说应该很容易。

最新更新