gpt4 book ai didi

Javascript 疯狂的数组内存问题

转载 作者:行者123 更新时间:2023-11-29 18:31:00 24 4
gpt4 key购买 nike

图表 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 混淆

重现问题的步骤:

  • 下载Flanvas开发分支
  • 确保将文件夹放在 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 中情况并非如此。为什么不呢?

最佳答案

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

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

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

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

或者因为它是基元数组,您可以切片它。

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]++;
}

请注意,这会使您的浏览器卡住 1000 毫秒

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

紧随其后的是 while 循环,该循环将运行 1000 毫秒,每次迭代都会使每个成员递增一次。

如果 console.log同步的,您会得到零。相反,您可能会得到如下内容:

[2811349, 2811349, 2811349, 2811349, 2811349]

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

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

console.log( arr.slice() );

// ...

[0, 0, 0, 0, 0]

关于Javascript 疯狂的数组内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8394094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com