push(array)和push([...array])二者有何区别?

以下是一段求数组[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)得到的结果全为空:[ [], [], [], [], [], [] ]

为什么会这样?

阅读 2.2k
1 个回答

res.push(path) 等于把 path 的引用,追加到了数组里面。所以如果path被改变了,res里面的也会改变。

res.push([...path]),这里等于把 path 的内容拿出来,重新构建了一个数组。然后追加。这里重点是切断了引用关系。相同的办法有深浅拷贝concatJSON.parse(JSON.stringify)

image.png

image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题