Javascript console.log中的Bug?

Javascript console.log中的Bug?,javascript,firefox,google-chrome,console,javascript-debugger,Javascript,Firefox,Google Chrome,Console,Javascript Debugger,可能重复: 我尝试以下代码: 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 = "

可能重复:

我尝试以下代码:

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或其他东西,请回复这个问题。
谢谢

对我来说,这更像是一种比赛状态。由于您只传递对
console.log()
的引用,因此它引用的值在实际记录时可能已更改。然后,当您使用setTimeout()时,该值会在记录后更改。传递值的克隆,而不是传递对
console.log()的引用。

这是某些浏览器中控制台日志的已知问题/功能

当您记录某些内容时,它可能不会立即转换为文本格式。如果日志存储了对您所记录对象的引用,那么当它实际显示在日志中时,它将转换为文本格式

这样做的好处是,在实际打开日志窗口显示日志之前,记录某些内容对性能的影响很小

即使在运行代码时打开了日志窗口,在函数运行时也不会发生更新(因为Javascript是单线程的),因此控制台窗口将显示函数末尾的值,当窗口更新时。

这是一个不断报告的错误,因为人们在报告之前不会查看错误跟踪程序:


遗憾的是,没有关于这一问题是否/何时解决的信息。在此之前,您需要先克隆对象,然后再将其传递到
控制台.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'

我在最新版本的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 ) ; };

您使用的是哪个版本的chrome?在哪个站台?我试图在我的控制台中运行您的代码,我得到了正确的/逻辑的答案您是如何使用
setTimeout
调用它的?我也试过了,得到了预期的结果。这不是一个bug,这是一个特性!Console.log保留对已记录对象的引用,以便您可以在运行时预览对象。若您已经更改了对象的属性,那个么这个更改自然也会显示在这个实时预览中。你们可以试着浏览这个对象,看看它的“层次结构”是无限深的,所以不可能缓存它。废话,我还以为我有一台量子计算机,可以在更新值之前更新它们!