Javascript Js:为什么移动而不是推?

Javascript Js:为什么移动而不是推?,javascript,push,Javascript,Push,我想做一个简单的倒计时函数,如果我把10作为参数传递,应该返回一个数组,比如[10,9,8,7,6,5,4,3,2,1] 我认为每次我的参数“n”传入下面的递归函数时,我只需在数组中推送新值“n”。但是这里看起来push方法不合适,它需要unshift方法,如下所示 但是为什么呢?我不懂逻辑 以下:推动n的功能: function countdown(n){ if (n < 1) { return [] } let array = [] array = count

我想做一个简单的倒计时函数,如果我把10作为参数传递,应该返回一个数组,比如[10,9,8,7,6,5,4,3,2,1]

我认为每次我的参数“n”传入下面的递归函数时,我只需在数组中推送新值“n”。但是这里看起来push方法不合适,它需要unshift方法,如下所示

但是为什么呢?我不懂逻辑

以下:推动n的功能:

function countdown(n){
  if (n < 1) {
    return []
  } 
  let array = []
  array = countdown(n-1)
  array.push(n)
  return array
}

console.log(countdown(10))
function countdown(n){
  if (n < 1) {
    return []
  } 
  let array = []
  array = countdown(n-1)
  array.unshift(n)
  return array
}

console.log(countdown(10))
函数倒计时(n){
if(n<1){
返回[]
} 
让数组=[]
数组=倒计时(n-1)
array.push(n)
返回数组
}
控制台日志(倒计时(10))
[1,2,3,4,5,6,7,8,9,10]

下面是取消n移位的函数:

function countdown(n){
  if (n < 1) {
    return []
  } 
  let array = []
  array = countdown(n-1)
  array.push(n)
  return array
}

console.log(countdown(10))
function countdown(n){
  if (n < 1) {
    return []
  } 
  let array = []
  array = countdown(n-1)
  array.unshift(n)
  return array
}

console.log(countdown(10))
函数倒计时(n){
if(n<1){
返回[]
} 
让数组=[]
数组=倒计时(n-1)
数组。取消移位(n)
返回数组
}
控制台日志(倒计时(10))

[10,9,8,7,6,5,4,3,2,1]

也许简化递归函数更容易,以表明如果需要更多的值,它将返回一个包含实际值的数组和一个扩展的rest数组

要获得降序数组,需要将larget值取到左侧sinde,将其余值取到右侧。这意味着
push
是错误的,
unshift
是正确的

函数倒计时(n){
如果(n<1)返回[]
返回[n,…倒计时(n-1)];
}

控制台日志(倒计时(10))
push
视为堆栈从左到右的推操作。在这种情况下,它可以简单地将一个元素推到堆栈的顶部(这里的顶部是最右边的元素)

unshift
类似于队列中从左到右的排队函数。这将在队列的末尾(最左侧)添加一个元素,队列的开头将被进一步推到(右侧)。

使用
Array.push()
实现的
countdown()
,递归函数首先计算所有较小的数组元素(
Array=countdown(n-1
)。然后,在递归调用之后,
push将
n
添加到数组中。因此对于
countdown(2)
数组是:

countdown(1).push(2) 
由于
倒计时(1)
倒计时(0)。推送(1)
倒计时(0)
[]
,我们可以将其扩展到

[].push(1).push(2)
最后看起来像

[]
[1]
[1, 2]
因此,我们可以看到,
push
实现在数组的末尾依次附加较大的值

另一方面,将元素添加到数组的开头。因此,按照与前面相同的递归“展开”之后,
unshift
实现将依次向数组的前面添加更大的值。
countdown(2)
变为
countdown(1)。unshift(2)
[2]基本相同。按(倒计时(1)
。因此输出将完成以下步骤

[]
[1]
[2, 1]

使用
push()
,这对您有帮助吗?标准的递归问题,询问和回答了数百次…注意,在递归调用发生后,您正在推送
,关键是:所有递归内容都将继续(当我调用我的函数count-down()时)在返回之前。如果我通过5,它会储存,不知何故:5,4,3,2,1,然后它会被放入数组中,从最后一个结果开始,所以:1,2,3,4,5。如果我使用非移位方法,它会是:1,然后2,1,然后3,2,1等等。如果我这样简化它,可以吗?还是听起来很奇怪?(谢谢)“所有的递归操作都将继续进行(因为我在返回“是的,没错。除了异步函数调用(这里不发生)之外,函数中的代码是自上而下执行的。我还将阅读有关“提升”的内容。”。