console.log中的错误?

时间:2012-06-20 11:42:25

标签: javascript firefox google-chrome console javascript-debugger

  

可能重复:
  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或其他东西 - 请回复此票。 谢谢!

5 个答案:

答案 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()在执行代码时使用“> Object”打印对象的引用
  • 显示单击三角形时对象的状态,而不管执行console.log()的代码行是什么
  • 如果要以当前状态打印对象,请打印克隆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 ) ; };