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

时间:2021-02-28 21:43:34

标签: javascript arrays

当我运行此代码时:

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: 

我很困惑,因为在我的代码中,我只将数组 splice 应用于 arr1,但 arrarr1 都缩小了。鉴于代码没有对其进行任何操作,我认为没有理由为什么 arr 应该缩小。谁能解释为什么会这样?谢谢。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

let arr1 = arr 不复制 arr。它复制 arr 引用,因此在赋值后两个变量都指向同一个数组。这就是日志显示两者变化的原因。

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