Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么这段代码返回一个空数组?_Javascript_Algorithm_Recursion_Data Structures_Permutation - Fatal编程技术网

Javascript 为什么这段代码返回一个空数组?

Javascript 为什么这段代码返回一个空数组?,javascript,algorithm,recursion,data-structures,permutation,Javascript,Algorithm,Recursion,Data Structures,Permutation,问题:给定一个不同整数的集合,返回所有可能的置换 示例:输入:[1,2,3] 期望输出: [1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 在JavaScript中数组不是通过引用传递的吗?为什么返回结果数组时它是空的 /** *@param{number[]}nums *@return{number[][]} */ var permute=函数(nums){ var结果=[]; 助手(nums,result,[]); 返回结果; }; var

问题:给定一个不同整数的集合,返回所有可能的置换

示例:输入:[1,2,3]

期望输出: [1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

在JavaScript中数组不是通过引用传递的吗?为什么返回结果数组时它是空的

/**
*@param{number[]}nums
*@return{number[][]}
*/
var permute=函数(nums){
var结果=[];
助手(nums,result,[]);
返回结果;
};
var helper=函数(nums、result、cur){
if(cur.length==nums.length){
结果:推送(cur);
}否则{
for(设i=0;ilog(permute([1,2,3])
调用
助手时,您只能创建一个
cur
数组:

helper(nums, result, []);
然后在
helper
中进行变异和递归传递。内存中只有一个数组;最后,您已经
.pop
从数组中删除了最后一项,
result
数组中的每一项都指向同一个对象,即现在为空的
cur
数组

相反,在循环内克隆
cur
,这样当/如果推送它时,您推送的是一个新数组,而不是对旧数组的引用,旧数组将在任何地方重复使用:

for (let i = 0; i < nums.length; i++) {
  const temp = cur;
  cur = [...cur, nums[i]]; // Similar to `.push`, except it creates a new array
  helper(nums, result, cur);
  cur = temp; // Similar to `.pop` - reverts the array to what it was originally
}
for(设i=0;i
var permute=函数(nums){
var结果=[];
助手(nums,result,[]);
返回结果;
};
var helper=函数(nums、result、cur){
if(cur.length==nums.length){
结果:推送(cur);
}否则{
for(设i=0;ilog(permute([1,2,3])
调用
助手时,您只能创建一个
cur
数组:

helper(nums, result, []);
然后在
helper
中进行变异和递归传递。内存中只有一个数组;最后,您已经
.pop
从数组中删除了最后一项,
result
数组中的每一项都指向同一个对象,即现在为空的
cur
数组

相反,在循环内克隆
cur
,这样当/如果推送它时,您推送的是一个新数组,而不是对旧数组的引用,旧数组将在任何地方重复使用:

for (let i = 0; i < nums.length; i++) {
  const temp = cur;
  cur = [...cur, nums[i]]; // Similar to `.push`, except it creates a new array
  helper(nums, result, cur);
  cur = temp; // Similar to `.pop` - reverts the array to what it was originally
}
for(设i=0;i
var permute=函数(nums){
var结果=[];
助手(nums,result,[]);
返回结果;
};
var helper=函数(nums、result、cur){
if(cur.length==nums.length){
结果:推送(cur);
}否则{
for(设i=0;ilog(permute([1,2,3])否,JavaScript中的所有内容都是按值传递的。在函数
helper
中,将创建一个局部变量
result
,然后在调用
helper
时为其赋值。您最想做的是:
result=helper(nums,result,[])

不,JavaScript中的所有内容都是按值传递的。在函数
helper
中,将创建一个局部变量
result
,然后在调用
helper
时为其赋值。您最想做的是:
result=helper(nums,result,[])

“JavaScript中的所有内容都是通过值传递的。”从技术上讲,这是正确的。但是为非原语参数复制和传递的值是对基础项的引用。因此,调用者和被调用者有两个不同的引用,每个引用指向相同的值。换句话说,
helper
中的
result
变量(除非重新赋值)是对
permute
中使用的引用
result
所引用的相同项的引用。从技术上讲,这是正确的。但是为非原语参数复制和传递的值是对基础项的引用。因此,调用者和被调用者有两个不同的引用,每个引用指向相同的值。换句话说,
helper
中的
result
变量(除非重新指定)是对
permute
中使用的引用
result
所引用的相同项的引用。