Почему он выдает мне эту ошибку # Неустранимая ошибка в строке 0 # Неустранимая ошибка JavaScript с недопустимым размером 169220804?

Код состоит из создания массива из диапазона чисел, а также наличия третьего аргумента, в котором он указывает шаги из чисел, если он имеет шаг 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.info(numberList);
        }
        else if (start > end){
            for(;start >= end;){
                numberList.push(start);
                start -= 1;
            }
            
            console.info(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.info(numberList);
    }
    else if (start < end && (Math.sign(step) == -1)){
        console.info("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.info(numberList);
    }

    //return numberList;
};

NumberRange(10,5,-2);
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
165
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

У вас опечатка в третьем утверждении for, последняя часть должна быть присваиванием вычитания:

for(;start >= end; start += step){
    numberList.push(start);
}

Но проблема, которую вы наблюдаете, намекает на внутреннюю ошибку в движке V8 (баг), возможно, это попытка выделить неправильный объем памяти. Я мог бы воспроизвести это в Node.js и в Chrome с помощью простого бесконечного цикла, как показано ниже.

var numberList = [];
while (true) {
    numberList.push(1);
}

На моей машине происходит сбой всего через несколько секунд, когда массив содержит 112813858 элементов.

Говоря об опечатках: =- должно быть += (поскольку step в этот момент отрицательное).

tevemadar 20.03.2022 01:11

@tevemadar Теперь все исправлено, еще раз спасибо!

GOTO 0 20.03.2022 01:45
Ответ принят как подходящий

for(;condition;) — это просто уродливый способ написания while(condition), не делайте этого.

Почему не работает часть for(;start >= end; start - step), которая не обновляет start, а просто вычитает из нее step и отбрасывает результат. Почему это не сработает с -, так это то, что step отрицательное значение в этой ветви, поэтому оно должно быть 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.info(`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.info(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);

Потом кого-то может раздражать наличие двух циклов с одинаковыми телами, а ведь при чуть более сложном условии их можно свернуть в один:

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

  if (Math.sign(step) != Math.sign(end - start)) {
    console.info(`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.info(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);

Большое спасибо, я много раз проходил логику и никогда не думал о смене de '-' на '+', мне еще нужно привыкнуть к циклам while.

Nsanity 20.03.2022 03:43

Другие вопросы по теме