Javascript疯狂的内存问题与数组

Javascript insane memory woe with Array

本文关键字:数组 问题 内存 疯狂 Javascript      更新时间:2023-09-26

展品A:

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

有时日志会吐出0 [Infinity, Infinity, Infinity, Infinity, Infinity, Infinity],但只有当您为pt做六个零数组时。如果你做5个0,那么你得到一个5个0的数组作为预期的。最大的问题是pt[0]有时会同时混淆0Infinity

重现问题的步骤:

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

*笔记

  • 有问题的控制台日志(附件A)位于src/flanvas.js的2958行
  • 该框架最近经历了一次"重载"。你会注意到并不是所有的东西都能正常工作——我知道。
  • 我正在测试Mac OSX 10.6.8Chrome 15.0.874.121

如果我的说明有任何问题,请反馈,我会尽快处理。谢谢。

**问题澄清**

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

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运行,每次迭代对每个成员加1。

如果console.log同步的,你会得到0。相反,您可能会得到这样的内容:

[2811349, 2811349, 2811349, 2811349, 2811349]

现在,如果我们改变它,使它记录一个数组的.slice(),你会看到你得到了预期的值。

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

console.log( arr.slice() );
// ...
[0, 0, 0, 0, 0]