JavaScript - 在递归期间,变量类型从对象变为数字

时间:2017-04-01 22:28:44

标签: javascript arrays recursion

我有一个函数可以推送数字"数字"到"输出"具有给定数量的"次"的数组。出于某种原因,在递归调用函数期间,"输出"数组成为一个数字,因此推送方法停止工作。任何人都可以向我解释为什么"输出"递归期间的变量变化?

function replicate(times, number, output) {
  if (output == undefined) output = [];
  if (times < 0) {
    return [];
  } else if (times == 0) {
    return output;
  } else {
    console.log(output, typeof output);
    return replicate(times - 1, number, output.push(number));
  }
}

//logs
//[] 'object'
//1 'number'

此致

2 个答案:

答案 0 :(得分:1)

这是因为数组上push方法的返回类型是它的长度!从来没有这样做过!应该是这样的:

function replicate(times, number, output) {
  if (output == undefined) output = [];
  if (times < 0) {
    return [];
  } else if (times == 0) {
    return output;
  } else {
    console.log(output, typeof output);
    output.push(number);
    return replicate(times - 1, number, output);
  }
}

答案 1 :(得分:0)

Array.prototype.push()返回数组的新长度,而不是数组。因此,您将一个数字output传递给您的函数,然后记录该函数。

  

push()方法将一个或多个元素添加到数组的末尾,并返回数组的新长度。

您可以使用concat()

return replicate(times - 1, number, output.concat(number));

代替,或先推送到数组

else {
    output.push(number);
    return replicate(times - 1, number, output);
}