以下是一段求数组[1,2,3]
的全排列的代码:
var permute = function(nums) {
let path = [], res = []
backTrack(nums, path, res)
return res
};
function backTrack(nums, path, res) {
if(path.length === nums.length) {
res.push([...path]) // 这行有问题!
return
}
for(const ele of nums) {
if(path.includes(ele)) continue
path.push(ele)
backTrack(nums, path, res)
path.pop()
}
}
console.log(permute([1,2,3]))
res.push([...path])
得出的结果是正确的,而res.push(path)
得到的结果全为空:[ [], [], [], [], [], [] ]
为什么会这样?
res.push(path)
等于把 path 的引用,追加到了数组里面。所以如果path被改变了,res里面的也会改变。res.push([...path])
,这里等于把 path 的内容拿出来,重新构建了一个数组。然后追加。这里重点是切断了引用关系。相同的办法有深浅拷贝、concat、JSON.parse(JSON.stringify)