const Range = function* (total = 0, step = 1, from = 0) { for (let i = 0; i < total; yield from + i++ * step) {} }; Array.from(Range(5, -2, -10)); //=> [-10, -12, -14, -16, -18] [...Range(5, -2, -10)]; // Five Elements With Step -2 From -10 //=> [-10, -12, -14, -16, -18] // Also works with for..of loop for (i of Range(5, -2, 10)) console.log(i); // 10 8 6 4 2 // Lazy loaded way const number0toInf = Range(Infinity); number0toInf.next().value; //=> 0 number0toInf.next().value; //=> 1 // ...