Оптимизация потребления памяти в JavaScript

Все созданные переменные хранятся в оперативной памяти компьютера. Иногда бездумное написание кода может резко увеличить потребляемую память.

Давайте посмотрим на примере. Пусть перед нами стоит задача найти сумму целых чисел от 1 до 100000000. Пусть у нас есть функция, которая заполняет массив целыми числами из заданного диапазона:

javascriptfunction fillArr(a, b) {
  let res = [];
  
  for (let i = a; i <= b; i++) {
    res.push(i);
  }
  
  return res;
}

Пусть у нас также есть функция, которая находит сумму элементов массива:

javascriptfunction getSum(arr) {
  let sum = 0;
  
  for (let elem of arr) {
    sum += elem
  }
  
  return sum;
}

С помощью комбинации этих функций можно легко решить поставленную задачу:

javascriptlet sum = getSum(fillArr(1, 100000000));

Получилось изящное решение. В нем, однако, есть проблема: оно потребляет громадное количество оперативной памяти.

Давайте посчитаем. Функция fillArr создает массив с 100000000 числами. Пусть JavaScript выделяет на число 2 байта - тогда для хранения нашего массива понадобится 200000000 байт, то есть что-то около 200 мегабайт оперативной памяти.

Но на самом деле оперативной памяти понадобится гораздо больше из-за того, что в JavaScript очень большие накладные расходы при хранении массива.

Понимая проблему, легко сделать функцию, решающую задачу и практически не потребляющий оперативной памяти:

javascriptfunction getNumsSum(max) {
  let sum = 0;
  
  for (let i = 1; i <= max; i++) {
    sum += i;
  }
  
  return sum;
}

Решим задачу с помощью нашей функции:

javascriptlet sum = getNumsSum(100000000);
Задание 1

Перед неким программистом стояла задача найти количество чисел, делящихся без остатка на 7, находящихся в заданном промежутке. Он решил ее следующим образом:

javascriptlet arr = [];

for (let i = 0; i <= 1000; i++) {
  if (i % 7 == 0) {
    arr.push(i);
  }
}

console.log(arr.length);

Объясните, что не так с этим кодом. Переделайте код на более оптимальный.

Задание 2

Перед неким программистом стояла задача найти сумму делителей числа. Он решил ее следующим образом:

javascriptfunction getDivisors(num) {
  let res = [];
  
  for (let i = 1; i <= num; i++) {
    if (num % i === 0) {
      res.push(i);
    }
  }
  
  return res;
}

function getSum(arr) {
  let sum = 0;
  
  for (let elem of arr) {
    sum += elem
  }
  
  return sum;
}

let sum = getSum(getDivisors(320));
console.log(sum);

Объясните, что не так с этим кодом. Переделайте код на более оптимальный.