Меня логика в объявлении параметров и 2 почти одинаковых цикла подбешивают.
Я бы как-нибудь так лучше сделал (не знаю как условие сократить, а очень хочется):
function range(start, end, step) {
step = step !== undefined ? step : (start < end ? 1 : -1);
let array = [];
for (let i = start; step > 0 && i <= end || step < 0 && i >= end; i += step)
array.push(i);
return array;
}