gpt4 book ai didi

javascript - 当我明确表示我不希望它通过引用传递数组时

转载 作者:行者123 更新时间:2023-11-28 15:18:50 25 4
gpt4 key购买 nike

我正在编写一个函数来计算矩阵的行列式。算法本身无关,但是如果有兴趣的话可以在this page底部找到。 .

function det(matrix) {
var dim = validate(matrix); // this function checks if it's an actual matrix and returns its dimensions as [rows, columns]
if(dim && dim[0] === dim[1]) {
var ord = dim[0];
if(ord === 2) {
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]; // easy
} else {
var r = 0;
for(var i = 0; i < ord; i++) { // using the first row
var elem = matrix[i][0],
mod = Math.pow(-1, i + 2);
minor = matrix.slice(0);
console.log(ord);
minor.splice(i, 1); // remove the ith column
for(var j = 0; j < ord - 1; j++) {
minor[j].splice(0, 1); // remove the first row
}
r += elem * mod * det(minor);
}
return r;
}
} else {
return false;
}
}

有一个问题:我有一个数组matrix,我想始终表示原始矩阵,即我不希望它被修改。当我复制它时,我编写 varminor = matrix.slice(0); 来创建一个新数组并停止通过引用传递matrix。这肯定意味着 minor 是一个单独的对象吗?显然不是。我不会在 else 分支中的任何其他点引用 matrix,但是,它在某个地方被修改了。通过 bruteforceesque console.logging,我将其范围缩小到这一行:

minor[j].splice(0, 1); // remove the first row

但是为什么呢?为什么这一行根本没有引用矩阵,最终会改变它的值?它肯定应该只改变 minor 的值吗?我可以做什么来解决这个问题?

最佳答案

Javascript 数组是一维的——你的矩阵是数组的数组。当您调用 slice 时,您将创建一个浅拷贝。也就是说,您正在创建一个包含完全相同的内部数组的新外部数组。您想要制作一个深层复制,同时创建新的内部数组。

function cloneMatrix (matrix) {
return matrix.map(function(sub) { return sub.slice(0); });
}

关于javascript - 当我明确表示我不希望它通过引用传递数组时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32417563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com