Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Google Chrome console.log()与对象和数组不一致_Javascript_Google Chrome_Google Chrome Devtools_Console.log - Fatal编程技术网

Javascript Google Chrome console.log()与对象和数组不一致

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]

今天我在帮助一位同事调试一些代码,我注意到Google Chrome中的
console.log()
出现了一个奇怪的行为:

如果您:

  • 创建嵌套数组(例如,[[345,“test”]])

  • 使用
    console.Log()
    将阵列记录到控制台

  • 修改一个内部数组值,然后
    console.log()
    将输出后面的值--而不是
    console.log()执行时数组的值

  • JavaScript

    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)
    这很有效,谢谢。