chrome中奇怪的console.logbehavior

时间:2011-12-01 22:10:02

标签: javascript google-chrome safari

我无法使用其他脚本重现此问题,因此请运行此脚本: http://jsfiddle.net/kz4k7/

如第154-157行所示:

for (myKey in v){
    console.log("v["+myKey +"] = "+v[myKey]); 
}
console.log(v);

你会期望前三行输出与最后一行相同。 但是我在chrome中得到了这个结果: enter image description here

如果我在第158行删除solveTriangle(v),console.log(v);的效果非常好。如果我将对象v的克隆版本打印到控制台,它也可以工作。

注意:这根本没有完成,我只是想知道为什么chrome会这样做。我也不想解释“你为什么这样做?”以及与此错误无关的其他问题。

修改

这也是Safari中的行为。

Firefox + firebug屏幕截图:

enter image description here

2 个答案:

答案 0 :(得分:2)

这是一个相当简单的问题。 Chrome存储对该对象的引用。如果在脚本完成后查看对象,则会看到此观察到的行为,因为对象已更改,与console.log触发时的对象不同。

如果在包含console.log(v);的行设置断点并检查该值,结果将是您所期望的。

答案 1 :(得分:1)

console.log显示对象在打开时包含的内容(通过单击箭头),而不是在记录时。坦率地说,你的代码非常冗长,并且有很多注释掉的代码,但是看起来你确实在记录它之后修改了对象。

您可以使用以下简化测试确认此日志行为:http://jsfiddle.net/e7Gvn/

var o = {
    a: 1,
    b: 2
};

console.log( JSON.stringify(o) ); // force string logging, which doesn't change

console.log(o); // open the object and you'll see that `c = 3`...
o.c = 3;        // ... even though it was only set here