为什么数组拼接应用于数组拼接不直接应用于?



当我运行这段代码时:

var uniqueOccurrences = function (arr) {
let occurrences = [];
let arr1 = arr;
for (let i = 0; i < arr.length; i++) {
let counter = 0;
for (let j = 0; j < arr1.length; j++) {
if (arr[i] === arr1[j]) {
counter++
arr1.splice(j, 1);
j--;
console.log('i: ' + i + ' :: ' + 'j: ' + j + ':: arr: ' + arr + ' :: ' + 'arr1: ' + arr1);
}
}
occurrences.push(counter);
}
};
uniqueOccurrences([1, 2, 2, 1, 1, 3]); 

得到以下输出:

i: 0 :: j: -1:: arr: 2,2,1,1,3 :: arr1: 2,2,1,1,3
i: 0 :: j: -1:: arr: 2,1,1,3 :: arr1: 2,1,1,3
i: 0 :: j: -1:: arr: 1,1,3 :: arr1: 1,1,3
i: 0 :: j: -1:: arr: 1,3 :: arr1: 1,3
i: 0 :: j: -1:: arr: 3 :: arr1: 3
i: 0 :: j: -1:: arr:  :: arr1: 

我很困惑,因为在我的代码中,我只应用数组splicearr1,但arrarr1都收缩。我看不出arr应该收缩的原因,因为代码中没有对它进行操作。有人能解释一下为什么会这样吗?谢谢。

arrarr1引用同一个对象。对对象的更改将通过两个引用可见。

arr1被改变时,arr也会被改变,因为数组是作为引用传递的,而不是作为值传递的。

您可以使用let arr1 = arr.slice()let arr1 = [...arr]

let arr1 = arr不复制arr。它复制arr引用,所以赋值后两个变量都指向同一个数组。这就是为什么log显示两者的变化。

为了防止它,你可以复制数组。浅复制(用旧数组的值创建新数组):let a1 = [...a]或者深度复制(与旧数组没有共享值),对此您可能需要使用一些库。

最新更新