如何解决shiftRows()函数中的数组元素位置计数问题?

时间:2019-05-20 14:53:45

标签: javascript arrays

今天,我发现JS与Array有关的一种怪异行为。我试图构建AES-128,问题出在函数shiftRows()上。我正在研究2D数组(4 * 4)的1D表示(16),并尝试将元素左移一些。

只要我尝试在控制台中打印,就可以。但是,每当我更改任何数组S或X(S的临时副本)的元素时,它都会更改整个返回值以及先前的打印值。我不知道我的浏览器在做什么。请帮助我。

测试阶段1:

function shiftRows(S) {
    var X = S;
    console.log(X);
    var p;
    for (var i = 0; i < 4; i++) {
        for (var j = 0; j < 4; j++) {
            p = (4 - i + j) % 4;
            console.log(p, X[4 * i + p]);
            // X[4 * i + j] = S[4 * i + p];
        }
    }
    return S;
}
var A = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
console.log(shiftRows(A));

第二阶段测试:

function shiftRows(S) {
    var X = S;
    console.log(X);
    var p;
    for (var i = 0; i < 4; i++) {
        for (var j = 0; j < 4; j++) {
            p = (4 - i + j) % 4;
            console.log(p, X[4 * i + p]);
            X[4 * i + j] = S[4 * i + p];
        }
    }
    return S;
}
var A = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
console.log(shiftRows(A));

第一阶段正常。 但是第二阶段很奇怪,因为通过添加语句来更改X的元素S也在改变,并且控制台输出对于前一行的X的元素值也在改变!

1 个答案:

答案 0 :(得分:0)

对象(以及数组,因为数组是对象),通过引用复制 ,因此如果这样做:

 var X = S;

您将对存储在S中的数组的引用复制到X,因此两者都引用同一数组。要创建副本,请执行以下操作:

 var X = [...S];