引发了预期的错误:RangeError:无效的数组长度

时间:2019-10-07 18:06:46

标签: javascript arrays try-catch reduce

我有一个简单的阶乘函数:

function factorial(n){
  let array = Array(n).fill(0).map((e, i) => i + 1)
  if (array.length) return array.reduce((a, b) => a * b);
  else {
    return 1;
  }
}  

但是由于某种原因,这会将Expected error was thrown: RangeError: Invalid array length丢到codewars中。

我正在尝试通过if-else块说明数组长度为0 /未定义。

但是,我仍然遇到错误。我不确定其他如何解释无效范围,坦率地说,我不明白它指的是什么。

我还尝试在try-catch中抛出“ rangeError”:

function factorial(n) {
  try {
    let array = Array(n)
      .fill(0)
      .map((e, i) => i + 1);
    return array.reduce((a, b) => a * b);
  } catch (error) {
    if (error instanceof TypeError) {
      throw new error();
    } else if (error instanceof RangeError) {
      throw new error();
    } else {
      throw error;
    }
  }
}

实际上,这产生了第二个错误: TypeError: error is not a constructor

3 个答案:

答案 0 :(得分:3)

如果给定负数,则尝试创建长度<0的数组,这会导致错误。您需要处理底片

Array(Math.abs(n))

这将创建一个长度为长度的数组,无论它是正数还是负数。

答案 1 :(得分:3)

您需要将RangeError扔到此处,以使值低于0 or greater than 12

function factorial(n) {
  if(n < 0 || n > 12){
    throw new RangeError('')
  }
  let array = Array(n).fill(0).map((e, i) => i + 1)
  if (array.length) return array.reduce((a, b) => a * b);
  else {
    return 1;
  }
}

答案 2 :(得分:3)

该问题的描述说,当n小于0且大于12时,您需要引发RangeError。因此,在此之前使用if语句,您将通过。

function factorial(n){
  if(n < 0 || n > 12){
    throw RangeError;
  }
  let array = Array(n).fill(0).map((e, i) => i + 1)
  if (array.length) return array.reduce((a, b) => a * b);
  else {
    return 1;
  }
}