Почему ‘NaN’ в JavaScript и как мне это исправить?

#javascript

#javascript

Вопрос:

Я создал программу, которая сообщает вам программу, которая принимает число в JavaScript и сообщает вам различные свойства этого числа.

 <!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
    </head>
    <body>
        <script>
            
            var div_sum = 0
            var num = Number(prompt('Please enter the number'))
            var pn_result = true
            for(var i = 2; i < num; i  ){
                if(num % i === 0){
                    var pn_result = false
                    break
                }
            }
            if(pn_result){
                alert(String(num)   'is a prime')
            } else {
                alert(String(num)   'is not a primen'   String(num)   '='   String(i)   'x'   String(num / i))
            }
            var div_list = []
            for(var div = 1; div < num   1; div  ){
                if(num % div === 0){
                    div_list.push(div)
                }
            }
            var div_len = div_list.length
            alert('Number of divisor is'   String(div_len) )
            
            for(var i = 0; i < div_len   1; i  ){
                var div_sum = div_sum   div_list[i]
            }
            var div_sum = div_sum - num
            alert(div_sum)
        </script>
    </body>
</html>
  

В конце мне стало любопытно, было ли это число идеальным числом, поэтому я вывел сумму делителя, исключая себя.

Но результат выполнения вышел как ‘NaN’.

Как ни странно, другие операции выполнялись в завершенном состоянии. Что такое ‘NaN’ и как мне это исправить?

Комментарии:

1. NaN означает «не число» — что Number('abcde') приводит к NaN — кстати, typeof NaN === 'number' итак, не число — это число: p — что касается «как мне это исправить»… это не сломано, это число, которое не является числом (поэтому NaN имеет методы toFixed, toPrecision и toExponential, как и любое другое число)

2. Я бы рекомендовал в качестве ПЕРВОГО теста после var num = Number(prompt('Please enter the number')) проверки, если isNaN(num) или Number.isNaN(num) , чтобы избежать дальнейших осложнений в вашем коде (обратите внимание, не проверяйте, если num === NaN поскольку NaN !== NaN

Ответ №1:

Основная проблема заключается в этой строке. Вы повторяете на 1 раз больше, чем длина div_list .

 for(var i = 0; i < div_len   1; i  ){
  var div_sum = div_sum   div_list[i]
}
  

Это должно быть

 for(var i = 0; i < div_len; i  ){
  var div_sum = div_sum   div_list[i]
}
  

Другие проблемы включают в себя повторное объявление div_sum внутри for loop и снова сразу снаружи. Вы должны объявить его только один раз, а затем переназначить ему новые значения как таковые.

 var div_sum = 0;
for(var i = 0; i < div_len   1; i  ){
  div_sum = div_sum   div_list[i]
}
div_sum = div_sum - num;
  

И, наконец, вы также должны использовать camelCase для именования JavaScript переменных. Это нормальное соглашение. Вместо этого вы используете snake_case соглашение, которое обычно не используется на JavaScript земле.

Ответ №2:

измените это

 for(var i = 0; i < div_len   1; i  )
  {
    var div_sum = div_sum   div_list[i]
  }
  

к этому, и это будет работать

 for(var i = 0; i < div_len; i  )
   {
     var div_sum = div_sum   div_list[i]
   }