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

问题描述

今天我发现了 JS 关于 Array 的一种奇怪行为。我正在尝试构建 AES-128,问题出在函数 shiftRows() 上。我正在研究二维数组(4 * 4)的一维表示(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));

测试阶段 2:

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 的元素值!

标签: javascriptarrays

解决方案


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

 var X = S;

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

 var X = [...S];

推荐阅读