【问题标题】:Mistake in javascript with NaN in an array数组中带有 NaN 的 javascript 错误
【发布时间】:2013-08-12 01:49:52
【问题描述】:

当我在 javascript 中执行这个函数时,我得到一个 NaN 结果。这似乎很不合逻辑,因为此操作中使用的数组都是数字的,并且当我使用 Alert() 执行此操作时正确显示;我将代码留在这里供您监督:

function calculation_errors(){      
    arr_error_P_t2=new Array();
    for(var i=0;i<arr_P_t1.length;i++){
        var K=new Number(arr_K_t1[i]);
        var P=new Number(arr_P_t1[i]);      
        arr_error_P_t2[i]=(Math.sqrt(1+Math.pow(m_t2,2)))*(Math.sqrt((Math.pow(1/K,2)+(Math.pow(1/P,2)))));
    }
    alert(arr_error_P_t2.join('\n'));
}

【问题讨论】:

  • "Number() 函数将对象参数转换为表示对象值的数字。如果该值不能转换为合法数字,则返回 NaN。"
  • 这段代码是不完整的,因为它引用了我们看不到的东西。您能否在jsfiddle.net 中构建一个以类似方式发生故障的独立示例并发布链接?
  • @Paul 他肯定在访问一个不存在的数组元素。请看下面我的回答。做小提琴是一件好事,但我认为这应该可以解决问题。 :)
  • 从 cmets (PRPGFerret) 看来他找到了答案。

标签: javascript arrays nan


【解决方案1】:

您必须在该数组中插入至少一项。

var arr_error_P_t2=[1]

【讨论】:

  • 有助于更好地指出您在答案中所指的数组
【解决方案2】:

您获得NaN 的原因是您的数组arr_K_t1 的长度小于您的数组arr_P_t1

在您的 for loop 中: 您正在尝试使用语句获得一个更大的数组元素

var K= arr_K_t1[i];

它返回undefined(因为你已经超过了arr_K_t1中的元素数量。所以在javascript中,如果你尝试访问一个不存在的数组元素,它会返回undefined

然后你正在对其进行数学运算,显然返回NaN(你得到的结果)。

解决办法是这样的:

函数计算错误(){
    arr_error_P_t2=新数组();

    //注释:您假设数组“arr_K_t1”的长度至少等于
    //数组“arr_P_t1”在后面的for循环中
    //这是一个错误的假设,最终导致“NaN”!!
    ...
    ...
    ...您的其余代码

编辑:我无法包含剩余的代码,因为它使帖子变得很奇怪。然而问题在于for loop 他正在访问一个不存在的元素。

【讨论】:

  • 感谢您的回答
【解决方案3】:

而不是使用new Number(),只需将您的值乘以1 (your_val * 1)。这是将值转换为整数的最简单、最快的方法。

function calculation_errors() {
    arr_error_P_t2 = [];
    for (var i = 0; i < arr_P_t1.length; i++) {
        var K = arr_K_t1[i] * 1;
        var P = arr_P_t1[i] * 1;
        arr_error_P_t2[i] = (Math.sqrt(1 + Math.pow(m_t2, 2))) * (Math.sqrt((Math.pow(1 / K, 2) + (Math.pow(1 / P, 2)))));
    }
    alert(arr_error_P_t2.join('\n'));
}

【讨论】:

  • 感谢您的回答
【解决方案4】:

不要将数字转换为对象,这应该可以解决您的 NaN 问题。

function calculation_errors(){      
    arr_error_P_t2=new Array();

    for(var i=0;i<arr_P_t1.length;i++){
        var K= arr_K_t1[i];
        var P= arr_P_t1[i];      
        arr_error_P_t2.push((Math.sqrt(1+Math.pow(m_t2,2)))*(Math.sqrt((Math.pow(1/K,2)+(Math.pow(1/P,2)))))); 
        //I prefer .push() but you don't have to use this part
    }

    alert(arr_error_P_t2.join('\n'));
}

【讨论】:

  • 哼....不幸的是,那里的任何东西都有效。我发现擦除“m_t2”可以看到结果数组,所以我认为这个问题与如何创建该变量有很大关系。
  • @ViceNocillator 检查我上面的解决方案..这应该可以帮助您解决问题。希望有帮助:)。男孩做这个花了很多时间。让我知道它是否有助于您解决它:)
  • 我知道发生了什么! m_t2 变量为空。它用于我之前应该在 html 中调用的其他函数。
  • 但是我会改进代码添加 PRPGFerret 提供的解决方案。非常感谢您的所有回答,伙计们!
【解决方案5】:

为什么一定要使用"new Number()"?如果你这样做,那将是一个对象。 不能直接打印对象。

【讨论】:

  • 嗯.. 我认为这是一种确保我会管理数字的方法。有人告诉我,JavaScript 可能比某种意义上更棘手......
猜你喜欢
  • 2016-06-27
  • 2014-04-30
  • 2013-06-15
  • 2017-01-01
  • 2014-03-25
  • 2016-02-07
  • 2017-03-08
  • 2011-07-03
  • 1970-01-01
相关资源
最近更新 更多