当我刚刚访问阵列时,为什么我会在这里获得NaN?

时间:2013-11-23 15:16:54

标签: javascript nan

  var inc = .001;
  var z = new Array(1.0/inc);
  for (var x = 0.0; x < 1.0; x += inc) {
    z.push(Math.cos(x));
  }
  var y = new Array(1.0/inc);
  for (x = 0.0; x < 1.0; x += inc) {
    y.push(1 - ((x * x) / 2) + ((x * x * x * x) / 24));
  }
  var sum = 0;
  for (var i = 0; i < (1.0/inc); i++) {
    sum += y[i] - z[i];
  }
  console.log(sum);
  console.log(sum/(1.0/inc));

我对Javascript很新,但是这里的数组充满了浮点数,当我拿出差异并尝试打印它们时它会返回NaN。我在这里难过。这是代码(http://jsfiddle.net/2v7wu/)的小提琴。谢谢!

3 个答案:

答案 0 :(得分:3)

您正在创建由1000个空值组成的数组,然后将额外元素推送到这些数组上。你的数组最终会有2000个元素,你可以迭代第一个(空)1000。

您不需要在Javascript中声明数组的长度,因此只需使用

var z = []
var y = []

会好的。

最后,您需要将最后一个循环中的数组索引更改为

sum += y[i] - z[i];

答案 1 :(得分:2)

因为您使用x表示使用i

for (var i = 0; i < (1.0/inc); i++) {
  sum += y[x] - z[x];
  //       ^------^--------- these should be i, not x
}

另见Gareth's point below,这与我在下面的注释#2有关。通过以初始长度开始然后使用push,您不会将事物放在您认为自己的位置。 : - )


两个旁注:

  1. 您不断重新评估1.0/inc。我建议一次并将其存储在变量中。

  2. 在JavaScript中,很少有任何理由来编写new Array(length)。只需使用var z = [];var y = [];这些数组aren't really arrays at all,它们将根据需要“增长”(但同样,没有大量内存重新分配,因为它们不是真正的数组)。

答案 2 :(得分:0)

在第三个循环中,您尝试使用浮点值x作为yz的索引。这会生成结果undefinedundefined - undefined评估为NaN

据推测,您打算使用i作为索引。