Ottimizzazione della ripetizione di operazioni pesanti in JavaScript

Nella lezione precedente, le chiamate ripetute di funzioni in realtà richiedono molto poco tempo e la nostra ottimizzazione non farà risparmiare molto. Tuttavia, le cose andranno molto peggio se chiameremo più volte una funzione "pesante" che richiede un tempo considerevole per essere eseguita.

Supponiamo, ad esempio, di avere una funzione che trova i divisori di un numero:

javascriptfunction getDivisorsSum(num) {
  let res = 0;
  
  for (let i = 1; i <= num; i++) {
    if (num % i === 0) {
      res += i;
    }
  }
  
  return res;
}

È ovvio che questa funzione sia abbastanza "pesante". Quindi sarebbe una cattiva idea scrivere un codice come questo:

javascriptlet num = 123456;

if (getDivisorsSum(num) >= 10 && getDivisorsSum(num) <= 100) {
  console.log('+++');
} else {
  console.log('---');
}

Sarebbe meglio, naturalmente, eseguire l'operazione "pesante" una sola volta e memorizzare il risultato in una variabile, per poi utilizzare questa variabile dove necessario:

javascriptlet num = 123456;
let sum = getDivisorsSum(num);

if (sum >= 10 && sum <= 100) {
  console.log('+++');
} else {
  console.log('---');
}
Задание 1

Ottimizza il codice qui sotto:

javascriptlet num = 1233456789;

if (getSumSquare(num) >= 10 && getSumSquare(num) <= 100) {
  console.log('+++');
} else {
  console.log('---');
}

function getSumSquare(num) {
  let digits = String(num).split('');
  let sum = 0;
  
  for (let digit of digits) {
    sum += digit ** 2;
  }
  
  return sum;
}