使用Array的Javascript疯狂内存祸患

时间:2011-12-06 01:08:50

标签: javascript

图表A:

var pt = [0,0,0,0,0,0];
console.log(pt[0], pt);

有时日志会吐出0 [Infinity, Infinity, Infinity, Infinity, Infinity, Infinity],但只有当您为pt执行SIX零数组时才会。如果你执行五个零,那么你得到一个由五个零组成的数组 expected 。大 clencher 是pt [0]偶尔可以0Infinity同时混淆

重新创建问题的步骤:

  • 下载Flanvas
  • Development分支
  • 确保将文件夹放在web-server目录中(否则会遇到跨域问题)
  • 运行页面examples/loader-svg.js
  • 查看控制台,看看我指的混淆。

*注

  • 控制台登录问题(图表A)位于第2958行的src/flanvas.js
  • 该框架最近经历了一次“大量”的更新,你会注意到并非一切正常 - 我知道。
  • 我正在Mac OSX 10.6.8Chrome 15.0.874.121
  • 进行测试

如果我的说明有任何问题,请回复,我会尽快给他们。感谢。

**澄清问题**

如果我运行console.log(pt[0], pt);,那么我希望数组ptpt[0]中的第一个值相同。我Exhibit A的情况并非如此。为什么不呢?

1 个答案:

答案 0 :(得分:4)

console.log()不一定是同步的,因此无论什么代码导致值Infinity都可能在以后发生。

如果要查看当前状态下的Array值,您需要确保以某种方式捕获其当前值。

一种方法是为此目的滥用JSON。

var pt = [0,0,0,0,0,0];
console.log(pt[0], JSON.stringify( pt ));

或者因为它是一个基元数组,你可以slice它。

var pt = [0,0,0,0,0,0];
console.log(pt[0], pt.slice());

要找到实际问题,您必须遵循pt并查看谁在滥用它。


示范

这是一个用于说明目的的演示。

http://jsfiddle.net/J7tbB/

var later = Date.now() + 1000;

var arr = [0,0,0,0,0];

console.log( arr );

while( Date.now() < later ) {
    var len = arr.length;
    while( len-- ) arr[len]++;
}

请注意,这会冻结您的浏览器1000ms

如您所见,它创建了一个包含5个成员的数组,初始化为0,然后立即将数组传递给console.log

在此之后,您将拥有一个while循环,该循环将针对1000ms运行,每次迭代都会为每个成员递增一次。

如果console.log 同步,您就会得到零。相反,你可能会得到类似的东西:

[2811349, 2811349, 2811349, 2811349, 2811349]

现在,如果我们更改它以便记录数组的.slice(),您将看到获得预期值。

http://jsfiddle.net/J7tbB/1/

console.log( arr.slice() );

// ...

[0, 0, 0, 0, 0]