【问题标题】:gettin NaN instead of a value in my array resultgettin NaN 而不是我的数组结果中的值
【发布时间】:2015-02-10 23:30:53
【问题描述】:

我正在创建一个函数来做一些微积分,结果将使用 console.log 显示在导航控制台上,但我遇到了 Array 结果的问题,它成功地将第一个结果添加到我的主要Array 使用arr.push(result),但其余的出现显示为NaN

这是代码:

function  Fibo() {
    var arr = [1, 2, 3];
    var result = 0;
    while(result < 4000000) {
          result = arr[arr.indexOf(arr.length)] + arr[arr.indexOf(arr.length - 1)];
          arr.push(result);
          console.log(arr);
          result = 0
    } 
}

Fibo();

这是结果:

[1, 2, 3, 5, NaN]
[1, 2, 3, 5, NaN, NaN]
[1, 2, 3, 5, NaN, NaN, NaN]
[1, 2, 3, 5, NaN, NaN, NaN, NaN]
[1, 2, 3, 5, NaN, NaN, NaN, NaN, NaN]
[1, 2, 3, 5, NaN, NaN, NaN, NaN, NaN, NaN]
[1, 2, 3, 5, NaN, NaN, NaN, NaN, NaN, NaN, NaN]
[1, 2, 3, 5, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN]
[1, 2, 3, 5, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN]

【问题讨论】:

  • undefined 与一个数字或另一个undefined 结果相加NaN

标签: javascript arrays nan


【解决方案1】:

主要有两个问题:

  1. indexOf 不是正确的使用方法。按照代码一步一步...

    arr[arr.indexOf(arr.length)] + arr[arr.indexOf(arr.length - 1)]
    arr[arr.indexOf(3)] + arr[arr.indexOf(2)]
    arr[2] + arr[1]
    3 + 2
    5
    
    arr[arr.indexOf(arr.length)] + arr[arr.indexOf(arr.length - 1)];
    arr[arr.indexOf(4)] + arr[arr.indexOf(3)]
    arr[-1] + arr[2]
    undefined + 2
    NaN
    
  2. 在 while 循环结束时将 result 设置为 0 将导致 while 循环在无限循环中运行!我的猜测是您正在清除变量,但要小心!

下面的代码修复了这两个问题(结果较低,只是作为健全性检查)

function Fibo() {
    var arr = [1, 2, 3];
    var result = 0;
    while(result < 400) {
          result = arr[arr.length-1] + arr[arr.length-2];
          if (isNaN(result)) { return }
          arr.push(result);
          console.log(arr);
    } 
}

Fibo();

【讨论】:

    【解决方案2】:

    当您将 5 添加到数组时,它会中断,这就是正在发生的事情。您的数组现在长度为 4。
    您的数组中没有 4,所以 arr.indexOf(arr.length)-1
    arr[-1]undefined
    undefined -1NaN

    您只想添加列表中的最后 2 个数字并将其添加到末尾,而不是使用 indexOf。

    function  Fibo() {
    var arr = [1, 2];
    var result = 0;
    while(result < 100) {
          result = arr[arr.length -1] + arr[arr.length -2];
          arr.push(result);
          console.log(arr);
      }
    }
    
    Fibo();
    

    【讨论】:

      【解决方案3】:

      尝试在推送之前添加 NaN 检查

      function  Fibo() {
          var arr = [1, 2, 3];
          var result = 0;
          while(result < 4000000) {
                result = arr[arr.indexOf(arr.length)] + arr[arr.indexOf(arr.length - 1)];
                if (isNaN(result)) { return }
                arr.push(result);
                console.log(arr);
                result = 0
          } 
      }
      

      【讨论】:

      • result 进行健全性检查很好,但首先构建result 的方式有问题
      • @ChrisForrence 是的,您在第二条评论中也指出了这个问题:)
      【解决方案4】:

      在第二次循环时,arr.length === 4。这不是您的数组的元素,所以这是您的第一个问题。您可能想改用 arr[arr.length - 1] 。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-27
        • 2020-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-11
        • 2021-10-09
        • 2016-08-09
        相关资源
        最近更新 更多