为什么它给我这个错误 # Fatal error in , line 0 # Fatal JavaScript invalid size error 169220804?

Nsa*_*ity 7 javascript arrays node.js

该代码包括从一系列数字创建一个数组,以及第三个参数,其中它指示数字的步骤,例如,如果它的步骤为 2,则它从 [1,3,5] 开始代码工作正常,除非我step以负数作为参数传递,例如NumberRange(10,5,-2);这就是错误出现的时候,在代码中它显示了我用于否定步骤的逻辑。

错误的图像

function NumberRange(start, end, step){
            
    var numberList = [];

    if(typeof(step) == 'undefined'){
        
        if(start < end){
            for(;start <= end; start++){
                numberList.push(start);
            }

            console.log(numberList);
        }
        else if(start > end){
            for(;start >= end;){
                numberList.push(start);
                start -= 1;
            }
            
            console.log(numberList);
        }
    }
    else if(start > end && (Math.sign(step) == -1)){  // This is the logic I created when a negative step is given as an argument.
        for(;start >= end; start - step){
            numberList.push(start);
        }

        console.log(numberList);
    }
    else if(start < end && (Math.sign(step) == -1)){
        console.log("Negative step cant work since the value of the beginning of the list is less than the end of it")
    }
    else{
        for(;start <= end;){
            numberList.push(start);
            start += step;
        }

        console.log(numberList);
    }

    //return numberList;
};

NumberRange(10,5,-2);
Run Code Online (Sandbox Code Playgroud)

tev*_*dar 5

for(;condition;)只是一种丑陋的写作方式while(condition),不要这样做。

为什么它不起作用是因为这for(;start >= end; start - step)部分不更新start,只是step从中减去并丢弃结果。为什么它不起作用-是因为该分支中的 thatstep是负数,所以它应该是start += step为了向下计数。

一般来说,你不需要 4 个分支,相反,step如果是 ,你可以设置为 +/-1 ,如果你真的愿意,你仍然可以在设置它之后但在使用它之前undefined验证 的符号:step

function NumberRange(start, end, step) {
  if (typeof(step) == 'undefined') {
    step = Math.sign(end - start);
  }

  if (Math.sign(step) != Math.sign(end - start)) {
    console.log(`Can't count from ${start} to ${end} using ${step} as stepsize.`);
  } else {
    var numberList = [];
    if (start > end) {
      while (start > end) {
        numberList.push(start);
        start += step;
      }
    } else {
      while (start < end) {
        numberList.push(start);
        start += step;
      }
    }
    console.log(numberList.join());
    return numberList;
  }
}

NumberRange(10, 5, -2);
NumberRange(1, 2);
NumberRange(2, 1);
NumberRange(1, 3, 2);
NumberRange(1, 3, -2);
NumberRange(3, 1, -2);
NumberRange(3, 1, 2);
Run Code Online (Sandbox Code Playgroud)

那么有人可能会对两个具有相同主体的循环感到恼火,毕竟,在更复杂的条件下,它们可以折叠成一个:

function NumberRange(start, end, step) {
  if (typeof(step) == 'undefined') {
    step = Math.sign(end - start);
  }

  if (Math.sign(step) != Math.sign(end - start)) {
    console.log(`Can't count from ${start} to ${end} using ${step} as stepsize.`);
  } else {
    var numberList = [];
    while ((step > 0 && start < end) || (step < 0 && start > end)) {
      numberList.push(start);
      start += step;
    }
    console.log(numberList.join());
    return numberList;
  }
}

NumberRange(10, 5, -2);
NumberRange(1, 2);
NumberRange(2, 1);
NumberRange(1, 3, 2);
NumberRange(1, 3, -2);
NumberRange(3, 1, -2);
NumberRange(3, 1, 2);
Run Code Online (Sandbox Code Playgroud)