console.log(array) 显示的数组内容与迭代数组并显示各个元素不同。

11

我有下面的代码:

console.log("start");
for(var i = 0; i < array.length; i++){
    console.log(i + " = " + array[i]);
}
console.log(array);
console.log("end");

这给了我以下输出:

[16:34:41.171] start
[16:34:41.171] 0 = 0
[16:34:41.172] 1 = 168
[16:34:41.172] 2 = 171
[16:34:41.172] [0, 168, 171, 139]
[16:34:41.172] end

也就是说,在迭代数组时它没有显示第139个元素,但是当输出整个数组时,console.log确实打印了它。为什么?(<-- 这就是问题)

我后来修改了数组,难道console.log延迟到我改变数组之后?请注意,即使调换语句的顺序,并且直接在开头放置console.log(array)也不会改变结果(仍然有不同的输出)。

我正在使用Firefox 20.0


2
你的数组是在哪里定义的?我看不到你的代码:http://jsfiddle.net/j08691/vJd6x/ - j08691
1
可能是[JavaScript:console.log()与alert()给出不同的结果]的重复问题(https://dev59.com/4W_Xa4cB1Zd3GeqP6egc) - Rob W
数组是对象属性吗?https://dev59.com/Fmsy5IYBdhLWcg3w4yDc#8249333 - Alex K.
Rob W:谢谢你回答我的问题。我一直以为console.log是即时和阻塞的,结果它并不是 :) - user1302914
似乎我不能接受重复的答案作为正确答案(即第一个)。因此,我已经接受了丹尼尔的答案。谢谢大家。 - user1302914
1个回答

16

更新:如果您想查看此行为,请复制并粘贴代码到控制台并执行。然后关闭开发者工具,再次打开,显然指针只在后台执行代码时才会发生(当您重新打开控制台时会发生这种情况)。

console.log输出的对象是指针而不是一个真实的值。这意味着,如果对象稍后更改,console.log对象将被更新。试试:

console.log("start");
var array = [1];
for(var i = 0; i < array.length; i++){
    console.log(i + " = " + array[i]);
}
console.log(array);
console.log("end");
array.push(9999);// you will see the 9999 in the console no matter it was added after the output.
为了避免指针问题,请尝试使用 console.log(array.join()),因为在您的应用程序的某个点上,您正在添加值 139。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接