【问题标题】:Typecast of return value in JavascriptJavascript中返回值的类型转换
【发布时间】:2021-10-20 03:08:35
【问题描述】:

函数倒计时(n){ return n

这里我的代码应该通过递归推送一个值。 仅当值大于 0 时。

我遇到的问题是 .push() 函数无法识别,因为函数倒计时 返回值是未知类型。

javascript 中有没有办法对我的返回值进行类型转换,所以它会识别 .push() 函数

【问题讨论】:

  • 是的,没错,我检查了我的代码,我只得到了我推送的内容:)。谢谢
  • 您是否正在尝试编写一个递归函数来返回一个包含 n 个连续元素的数组?
  • push() 确实返回一个数字,而不是一个数组。因此countdown(n-1) 在某个时候返回一个数字,它没有.push() 方法。
  • 函数倒计时(n){ if (n
  • @Ramesh Reddy 是的,我正在尝试,但基于我的代码,我只返回当前推送的值。

标签: javascript arrays recursion casting return


【解决方案1】:
function countdown(n){ return n<=0?new Array():countdown(n-1).push(n); }

这个递归函数不起作用,因为Array.prototype.push 返回数组的长度,而不是数组本身。

您可以通过传递 1 作为参数来检查行为。任何大于 1 的值都会引发错误,因为递归函数会尝试对数字调用 push。

function countdown(n) {
  return n <= 0 ? new Array() : countdown(n - 1).push(n);
}

console.log(countdown(1))

这是获取包含 n 个元素的数组的替代方法。

function countdown(n, arr = []) {
  if (n <= 0) return arr;
  arr.push(n)
  return countdown(n - 1, arr);
}

console.log(countdown(2))

【讨论】:

    【解决方案2】:

    push() 确实返回了新的长度——一个数字,而不是一个数组。因此countdown(n-1) 在某个时候返回一个数字,它没有.push() 方法。

    你可以使用

    function countdown(n) {
        if (n <= 0) {
            return [];
        } else {
            const result = countdown(n-1);
            result.push(n);
            return result;
        }
    }
    

    或使用.concat() 代替push()

    function countdown(n) {
        return n <= 0 ? [] : countdown(n-1).concat([n]);
    }
    

    或扩展语法

    function countdown(n) {
        return n <= 0 ? [] : [...countdown(n-1), n]);
    }
    

    但后两者将具有O(n²) 时间复杂度,因为重复将元素复制到新数组中。比push 解决方案更有效的是非递归函数

    function countdown(n) {
        return Array.from({length: n}, (_, i) => i);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      • 2019-12-18
      • 1970-01-01
      • 2018-11-02
      • 2017-04-06
      相关资源
      最近更新 更多