今天,我发现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的元素值也在改变!
答案 0 :(得分:0)
对象(以及数组,因为数组是对象),通过引用复制 ,因此如果这样做:
var X = S;
您将对存储在S
中的数组的引用复制到X
,因此两者都引用同一数组。要创建副本,请执行以下操作:
var X = [...S];