Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何修复shiftRows()函数中的数组元素位置计数问题?_Javascript_Arrays - Fatal编程技术网

Javascript 如何修复shiftRows()函数中的数组元素位置计数问题?

Javascript 如何修复shiftRows()函数中的数组元素位置计数问题?,javascript,arrays,Javascript,Arrays,今天我发现了一个关于数组的奇怪行为。我试图构建AES-128,问题在于函数shiftRows()。我正在研究2D数组(4*4)的一维表示(16),并尝试将元素左移一定量 每当我尝试只在控制台中打印时,它都是正常的。但是,每当我更改任何数组S或X(S的临时副本)的元素时,它都会更改整个返回值以及以前的打印值。我不知道我的浏览器在做什么。请帮帮我 测试阶段1: function shiftRows(S) { var X = S; console.log(X); var p;

今天我发现了一个关于数组的奇怪行为。我试图构建AES-128,问题在于函数shiftRows()。我正在研究2D数组(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));
功能移位开关{
var X=S;
控制台日志(X);
var-p;
对于(变量i=0;i<4;i++){
对于(var j=0;j<4;j++){
p=(4-i+j)%4;
log(p,X[4*i+p]);
//X[4*i+j]=S[4*i+p];
}
}
返回S;
}
VarA=[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));
功能移位开关{
var X=S;
控制台日志(X);
var-p;
对于(变量i=0;i<4;i++){
对于(var j=0;j<4;j++){
p=(4-i+j)%4;
log(p,X[4*i+p]);
X[4*i+j]=S[4*i+p];
}
}
返回S;
}
VarA=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
console.log(shiftRows(A));
第一阶段可以。 但第二阶段很奇怪,因为通过添加语句来更改X的元素s正在更改,并且控制台输出也在更改前一行的X的元素值

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

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

 var X = [...S];

谢谢您的解决方案,先生:)