用js递归实现数组的全排列,并且将所有的结果放在一个大数组中

function permute(input) {
    var permArr = [],
    usedChars = [];
    function main(input){
        var i, ch;
        for (i = 0; i < input.length; i++) {
            ch = input.splice(i, 1)[0];
            // ch = input[i];
            usedChars.push(ch);
            if (input.length == 0) {
                permArr.push(usedChars.slice());
                // permArr.push(usedChars);
            }
            main(input);
            input.splice(i, 0, ch);
            usedChars.pop();
        }
        return permArr
    }
    return main(input);
};
console.log(permute([5,3,7,1]));

代码从网上找的,可以实现;但是有两行注释:和之前的写法作用不是一样吗,为什么运行就不对了?
?=,为啥还有问题啊 头大?

ch = input.splice(i, 1)[0];是从原数组中移除元素,并返回被移除的元素。这样下一层递归的input中就减少了一个元素。
而 ch = input[i];不会移除元素
permArr.push(usedChars.slice());是对usedChars数组浅拷贝一份,再添加到permArr中。使permArr中的数组都是不同的引用地址。
而 permArr.push(usedChars); 没有对usedChars数组进行拷贝,添加到permArr中的每个usedChars都是同一个数组引用地址。这样改变其中一个数组的属性,permArr中所有数组都会一起改变。

不一样阿,splice对数组进行修改的