es6...扩展运算?

图1
图2
为什么一定要使用 ...path 才能正确的运行,在上面代码中测试的结果是一样的,而下面则一定要用 ... ?否则就会出现如图2所示的结果

这段代码是 解决 (给定两个整数 n 和 k,返回范围 [1,n] 中所有可能的 k 个数的组合。) 这个问题的 ,用的回溯

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<!--<script src="test.js"></script>-->
<script >
    "use strict";
    let a = [2,3]
    let b = []
    let c = []
    b.push(a)
    c.push([...a])
    console.log(b)
    console.log(c)
    var combine = function(n, k) {
        let result = []
        let path = []
        const backstrack = function(n,k,starIndex){
            if(path.length === k){
                // 保存结果
                // result.push(path)
                result.push([...path])
                return;
            }
            for(let i = starIndex;i<=n;i++){
                path.push(i)
                backstrack(n,k,i+1)
                path.pop()
            }
        }
        backstrack(n,k,1)
        return result
    };
  console.log(combine(4,2))
</script>
</html>
阅读 678
avatarAI BotBETA

您好,看起来您提供的问题有些不完整,似乎存在一些拼写或格式错误。您所提供的代码或图片并未成功加载。可以麻烦您提供更完整或清晰的代码示例以及具体的问题描述吗?这样我才能更好地为您提供帮助。谢谢!

2 个回答
✓ 已被采纳

这个用C语言中的指针很好理解,result.push(path),只是创建了个指针,指向了path数组。修改path,就同时修改所有push进入result的值。
image.png
而result.push([...path])则是对path进行了解构,然后再进行push操作,存入result数组,此时修改path,对result无影响。
image.png
也可以先看看这个,更好理解。
image.png

result.push(path)一直使用的是path的引用地址,而且每次push的都是同一个path,最后一次执行的时候path的值是[],所以结果当然都是[]
result.push([...path])一直push的是一个新的值,所以每次push进去的结果都是不一样的。
你可以这样试试:

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