Javascript Google Chrome console.log()与对象和数组不一致
今天我在帮助一位同事调试一些代码,我注意到Google Chrome中的Javascript Google Chrome console.log()与对象和数组不一致,javascript,google-chrome,google-chrome-devtools,console.log,Javascript,Google Chrome,Google Chrome Devtools,Console.log,今天我在帮助一位同事调试一些代码,我注意到Google Chrome中的console.log()出现了一个奇怪的行为: 如果您: 创建嵌套数组(例如,[[345,“test”]]) 使用console.Log()将阵列记录到控制台 修改一个内部数组值,然后console.log()将输出后面的值--而不是console.log()执行时数组的值 JavaScript: var test = [[2345235345,"test"]] console.log(test); test[0][0]
console.log()
出现了一个奇怪的行为:
如果您:
console.Log()
将阵列记录到控制台console.log()
将输出后面的值--而不是console.log()执行时数组的值
var test = [[2345235345,"test"]]
console.log(test);
test[0][0] = 1111111;
// outputs: [[1111111,"test"]]
var testb = {};
testb.test = "test";
console.log(testb);
testb.test = "sdfgsdfg";
// outputs: {"testb":"test"}
var testc = ["test","test2"];
console.log(testc);
testc[0] = "sdxfsdf";
// outputs: ["test","test2"]
这种行为在Firefox中不会发生
还要注意的是,如果我在Chrome调试器中逐行检查他的代码,那么console.log()
将输出正确的值
对于这种奇怪的现象有什么解释吗?或者这只是谷歌Chrome的一个bug
编辑:
我已经缩小了复制不一致的console.log()
行为的步骤:
如果将此脚本添加到页面:
var greetings=['hi','bye'];
console.log(greetings);
setTimeout(function(){
greetings.push('goodbye');
},3000);
然后在Chrome控制台窗口已打开的情况下在新窗口中打开它,则console.log()
输出将不同于在控制台窗口关闭的情况下加载页面
在第一种情况下,当console窗口已经打开时,console.log()
将输出数组的当前值(即两项)
在第二种情况下,当控制台窗口最初关闭并仅在页面加载后打开时,console.log()
将输出数组的后续值(即三项)
这是Google Chrome的
console.log()功能中的一个bug吗?经过大量挖掘,我发现这已被报告为一个bug,在Webkit中修复,但显然还没有加入Google Chrome
据我所知,这个问题最初是在这里报道的:
米奇·克莱默描述2010-03-05 11:37:45太平洋标准时间
1) 创建具有一个或多个属性的对象文字
2) 记录该对象,但将其关闭(不要在控制台中展开)
3) 将其中一个属性更改为新值
现在打开console.log,您将看到它由于某种原因具有新值,即使它在生成时的值不同
我应该指出,如果你打开它,如果不清楚,它将保留正确的值
铬开发商的回应:
评论#2来自帕维尔·费尔德曼2010-03-09 06:33:36太平洋标准时间
我想我们永远也修不好这个。我们不能在将对象转储到控制台时克隆它,也不能监听对象属性的更改以使其始终成为现实
我们应该确保现有的行为是预期的
两年半后的2012年8月9日,Webkit()实施了一个补丁,但它似乎还没有进入Chrome
从今天起,将对象(数组)转储到控制台将导致对象的属性被删除
在控制台对象扩展时读取(即延迟)。这意味着在
使用控制台进行调试将很困难
此更改将在对象/数组开始预览时开始为其生成缩写预览
记录并将此信息传递到前端。只有在前端
已打开,它仅适用于console.log(),而不适用于实时控制台交互
我找到了解决此错误/功能的方法
console.log(JSON.parse(JSON.stringify(myObject)));
编辑:不幸的是,这不适用于像函数这样的非基本值。在此处使用另一个克隆实用程序
jQuery示例:
console.log($.extend({}, myObject));
虽然我不知道如何,确切地说,这不是一个bug,但Chrome做这种事情的频率很高;您也可以记录AJAX请求的结果;它追溯性地填写它,大概是为了在记录时更清晰。我太不熟练了,无法解释为什么,我刚刚遇到了一个类似的问题。但是,任何依赖于正确值的代码都可以正常运行。似乎记录到控制台的值是一个活动值。在控制台输出中展开有问题的对象之前,不会计算引用对象中的任何标量值。奇怪的是,console.log()
的结果会受到类似竞争条件的约束。当我单步执行同事的代码时,console.log()
会输出我们期望的值,但在正常执行时,它会输出一个后来修改的值——似乎您希望在执行console.log()
的精确时刻获得数组的值。这不是一个bug,Chrome故意让console.log显示live value,这可能是“这意味着在使用控制台调试时转储同一对象将很难”的重复,我几个月前才意识到这一点,这让我发疯了。谢谢。在过去的几天里,我一直在努力找出我的代码到底出了什么问题。这一直是Chrome的一个问题,它的2017年和现在仍然是嵌套对象值的问题。我昨天花了几个小时调试一个编码插件,因为它没有显示值,当我记录obj分配和嵌套obj之前/之后时,结果是chrome。它仍然是个好主意!您还可以重写toString
函数不幸的是,并非所有对象都可以字符串化。e、 例如,JSON.stringify(document.body)
这很有效,谢谢。