【问题标题】:Javascript insane memory woe with ArrayArray 的 Javascript 疯狂内存问题
【发布时间】:2011-12-06 01:08:50
【问题描述】:

展览 A:

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

有时日志会输出0 [Infinity, Infinity, Infinity, Infinity, Infinity, Infinity],但仅当您为pt 执行六个零数组时。如果你做了五个零,那么你会得到一个由五个零组成的数组预期。最大的紧握是 pt[0] 有时如何同时成为 0Infinity 混乱

重现问题的步骤:

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

*备注

  • 有问题的控制台日志(附件 A)位于第 2958 行的src/flanvas.js
  • 该框架最近经历了“shload”更新,您会注意到并非一切正常 - 我知道。
  • 我正在测试Mac OSX 10.6.8Chrome 15.0.874.121

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

** 澄清问题**

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

【问题讨论】:

  • @harto 如果我运行console.log(pt[0], pt);,那么我希望数组ptpt[0] 中的第一个值相同。在这种情况下,它不是。我也会将此添加到编辑中。
  • 这不是框架开发者的问题吗?
  • @Jackson - 你是说 Exhibit A 本身就足以证明问题吗?或者它只是框架代码中的一个问题(大概在console.log之前和之后对数组做了其他事情)?
  • @Jackson,pt[0] 将变为 0,pt 将变为对数组的引用。如果console.log在将数组转成字符串之前等待一段时间,0仍然是0,但数组可能已经改变了。
  • @nnnnnn Exhibit A 本身就很好。相对于它的块它不好,因此我很困惑。 @@James Clark 这很可能,但似乎不太可能。 @@@RightSaidFred 先生,您在玩游戏。我覆盖了同一个变量,因为我假设这将“重置”变量,并且我没有遇到“旧内容”的危险。然而,看起来“旧内容”实际上是正在显示的内容,因为 JS 尊重那些对我来说很奇怪或新奇的规则(可能是后者)。

标签: javascript


【解决方案1】:

console.log() 不一定是同步的,因此导致值变为Infinity 的任何代码都可能稍后发生。

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

一种方法是为此目的滥用 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]

【讨论】:

  • 这似乎是谷歌浏览器的一个怪癖。我在 FireFox 和 IE 中全为零。
  • @gilly3:可能是这样。我通常在 Chrome 中进行测试,过去我在将对象传递给 console.log 时注意到了这种不同步行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 2011-08-24
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
相关资源
最近更新 更多