Код состоит из создания массива из диапазона чисел, а также наличия третьего аргумента, в котором он указывает шаги из чисел, если он имеет шаг 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);
У вас опечатка в третьем утверждении for
, последняя часть должна быть присваиванием вычитания:
for(;start >= end; start += step){
numberList.push(start);
}
Но проблема, которую вы наблюдаете, намекает на внутреннюю ошибку в движке V8 (баг), возможно, это попытка выделить неправильный объем памяти. Я мог бы воспроизвести это в Node.js и в Chrome с помощью простого бесконечного цикла, как показано ниже.
var numberList = [];
while (true) {
numberList.push(1);
}
На моей машине происходит сбой всего через несколько секунд, когда массив содержит 112813858 элементов.
@tevemadar Теперь все исправлено, еще раз спасибо!
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.
Говоря об опечатках:
=-
должно быть+=
(посколькуstep
в этот момент отрицательное).