为什么当我将轨道推送到数组时,数组中的所有元素都发生了变化

why when I push the track to array, all the elements in array changed

我尝试解决 leetcode 46.JS 中的排列,但是下面的代码得到了错误的结果,但是当使用 res.push([...track]) 而不是 res.push(track) 时是正确的。我对此感到困惑,在我看来这两个是相同的。谢谢!

var permute = function(nums) {
    const res = []
    backtrack(res, [], nums)
    
    return res
};

var backtrack = function(res, track, nums) {
    if (track.length == nums.length) {
        console.log('track: ', track)
        console.log('res: ', res)
        console.log()

        res.push(track)
        //res.push([...track])
        return 

    }
    
    for (let i = 0; i < nums.length; i++) {
        if (track.includes(nums[i])) continue      
        track.push(nums[i])
        backtrack(res, track, nums)
        track.pop()
    }
}

const res = permute([1,2,3])
console.log(res)

因为res.push(track) 这将track 数组的引用保留在res 数组中。当您之后更改曲目时, res 数组也会更改。因此,您需要通过执行 [...track] 来创建一个包含轨道中项目的新数组。例如,

let res = [];
let track = [1,2,3];
res.push(track);
track.push(4);

console.log(track); // [1,2,3,4]
console.log(res); //[1,2,3,4]


res = [];
track = [1,2,3];
res.push([...track]);

track.push(4);

console.log(track); // [1,2,3,4]

console.log(res); //[1,2,3]