可能重复:
Is Chrome's JavaScript console lazy about evaluating arrays?
我尝试以下代码:
var myList = new Object();
var item = new Object();
item.text = "item-1";
myList[3] = item;
console.log(myList);
console.log(myList[3].text);
// Assign another object to the same entry
var item2 = new Object();
item2.text = "item-2";
myList[3] = item2;
console.log(myList);
console.log(myList[3].text);
结果很奇怪:
* Object
* 3: Object
text: "item-2"
item-1
* Object
* 3: Object
text: "item-2"
item-2
但是 - 如果我在一段时间后执行第二部分(使用setTimeout),并展开第一个对象,我说得对,即:
* Object
* 3: Object
text: "item-1"
item-1
* Object
* 3: Object
text: "item-2"
item-2
我发现分享它很重要,因为我认为人们可以浪费大量时间来试图理解他的代码中的错误。 如果有人提到一个开放的bug或其他东西 - 请回复此票。 谢谢!
答案 0 :(得分:5)
我的观点是,这是一个令人讨厌的“特征”,我真的希望我可以关闭它,它使调试成为一场噩梦,不知道在某个时间点某些东西可能更新了一个对象,同时试图建立确切的对象在代码的给定点处陈述。该功能对于“观察点”等非常有用,但在“LOG”中却没有用(名称中的线索)。
考虑以下代码片段:
var person = {'name':'Tom'};
console.log( person); //output the entire object variable
person.name = 'Thomas';
//the output is an object, whose 'name' value is 'Thomas', even though the log statement was placed before the value was changed to 'Thomas'.
然后:
var person = {'name':'Tom'};
console.log( person.name); //changed to output a string variable
person.name = 'Thomas';
//the output here, however, has not dynamically updated and correctly outputs 'Tom'
答案 1 :(得分:3)
这是一个known bug (50316),会一次又一次地报告,因为人们在报告之前没有看过bugtracker:
遗憾的是,没有关于是否/什么时候会得到解决的信息。直到那一刻,你需要克隆对象,然后再将它们传递给console.log()
。
答案 2 :(得分:0)
对我而言,更像是竞争条件而不是其他任何事情。由于您只传递对console.log()
的引用,因此它引用的值可能会在实际记录时更改值。然后,当您使用setTimeout()时,值会在记录后更改。不是传递对console.log()
的引用,而是传递值的克隆。
答案 3 :(得分:0)
这是某些浏览器中控制台日志的已知问题/功能。
当您记录某些内容时,可能不会立即将其转换为文本格式。如果日志存储对您记录的对象的引用,则当它实际显示在日志中时,它将变为文本格式。
这样做的好处是,在您实际打开日志窗口以显示日志之前,记录某些内容对性能的影响非常小。
即使您在运行代码时打开了日志窗口,在您的函数运行时也不会发生更新(因为Javascript是单线程的),因此控制台窗口将显示结束时的值。窗口更新时的功能。
答案 4 :(得分:0)
我已经在最新版本的Chrome 20.0.1132.57 m上对这个“问题”进行了一些实验。总结一下要点: -
console.log(JSON.parse(JSON.stringify(obj)));
您可以使用这段代码在自己的浏览器上进行测试:
window.onload = function() {chto = {a : 10, b : 20};
console.log('Open this object after 5 seconds')
console.log(chto);
console.log('Open this object before 5 seconds')
console.log(chto);
console.log('Console of the cloned object')
console.log(JSON.parse(JSON.stringify(chto)));
setTimeout(function(){ console.log('5 seconds up'); chto['b'] = 30; },5000 ) ; };