图表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]偶尔可以0
和Infinity
同时混淆
重新创建问题的步骤:
Development
分支
examples/loader-svg.js
*注
src/flanvas.js
Mac OSX 10.6.8
和Chrome 15.0.874.121
如果我的说明有任何问题,请回复,我会尽快给他们。感谢。
**澄清问题**
如果我运行console.log(pt[0], pt);
,那么我希望数组pt
和pt[0]
中的第一个值相同。我Exhibit A
的情况并非如此。为什么不呢?
答案 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
并查看谁在滥用它。
这是一个用于说明目的的演示。
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()
,您将看到获得预期值。
console.log( arr.slice() );
// ...
[0, 0, 0, 0, 0]