Javascript疯狂的内存问题与数组
Javascript insane memory woe with Array
展品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]有时会同时混淆0
和Infinity
重现问题的步骤:
- 下载Flanvas
Development
分支 - 确保你把文件夹放在web-server目录(否则你会遇到跨域问题)
- 运行
examples/loader-svg.js
页面 - 查看控制台,看看我所指的混乱。
*笔记
- 有问题的控制台日志(附件A)位于
src/flanvas.js
的2958行 - 该框架最近经历了一次"重载"。你会注意到并不是所有的东西都能正常工作——我知道。
- 我正在测试
Mac OSX 10.6.8
和Chrome 15.0.874.121
如果我的说明有任何问题,请反馈,我会尽快处理。谢谢。
**问题澄清**
如果我运行console.log(pt[0], pt);
,那么我期望数组pt
和pt[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()
,你会看到你得到了预期的值。
console.log( arr.slice() );
// ...
[0, 0, 0, 0, 0]
相关文章:
- JavaScript/jQuery JSON数组问题-值为未定义
- array_push平面数组问题-需要能够向数组中添加多个变量
- 尽管使用了off,click函数仍会触发,这可能也会导致数组问题
- JavaScript/jQuery悬停函数的行为很有趣——数组问题
- 使用新值更新时出现数组问题
- Javascript 矩阵数组问题
- 对于javascript和jquery的循环数组问题
- 绘制 C3 图表时的 JSON 到数组问题
- Spring 3 中的字符串数组问题
- JavaScript 数组问题
- Javascript图像数组问题
- Javascript数组问题
- 使用JS的数组问题
- 简单的Javascript数组问题
- 在多维数组问题上用javascript实现foreach循环
- 合并并返回唯一数组问题
- Javascript关联数组问题
- ng-repeat声明中的数组问题
- d3.js数组问题:Uncaught TypeError: Cannot read property 'date
- Javascript数组问题:无法读取未定义属性