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

标签 javascript arrays pass-by-reference

我正在编写一个函数来计算矩阵的行列式。算法本身无关,但是如果有兴趣的话可以在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/

相关文章:

c - 当我们可以选择使变量成为外部变量时,为什么我们要通过引用传递?

javascript - 使用 javascript 应用视差效果时图像在晃动

javascript - javascript中的pythonic嵌套默认字典

c - C 编程中未初始化的数组

Javascript动态字符串数组

c++ - 通过引用传递给构造函数

javascript - AngularJS 通过模板在组件之间进行通信(带有 promise )

javascript - 将 href 文本传输到文本框

Java:如何对数组元素进行双重检查锁定?

c++ - 传递引用参数并返回引用