javascript控制台什么时候评估打印对象的内容?

时间:2015-08-06 22:13:09

标签: javascript

我发现在嵌套对象上使用console.log时,结果似乎是在执行后续操作后打印的,但仅限于记录深度至少为2的对象时。

考虑以下示例:

function addNumbers(data) {
    data.container.firstNumber++ 
    console.log(data); // 3
    data.container.firstNumber++
}

var numberData = {
    container : {
       "firstNumber": 1
    }
};

console.log(numberData); // 3
addNumbers(numberData);

我假设在这个例子中我会看到numberData打印的值为1然后是2.实际上,值是3,3。我的第一个想法是这里有一些竞争条件,其中值在日志之前发生变化操作可以完成,但是如果你向对象添加更多特定的引用,你将获得与代码中的console.log位置匹配的值,如下所示:

function addNumbers(data) {
    data.container.firstNumber++ 
    console.log(data.container); // 2
    data.container.firstNumber++
}

var numberData = {
    container : {
       "firstNumber": 1
    }
};

console.log(numberData.container); // 1
addNumbers(numberData);

为什么变量在第一个示例中没有计算相对于console.log位置的值,而是在第二个示例中?

relevant fiddle

1 个答案:

答案 0 :(得分:0)

大多数浏览器仅在展开对象时获取登录到控制台的对象的属性 - 并且经常在对象引用旁边的工具提示中注意这一点。

它们也倾向于仅在第一次扩展对象并从那时开始缓存,因此控制台不是检查对象的可靠方法。

为了解决这个问题,浏览器提供了一个更频繁更新的监视面板,可以与断点或步进一起使用来重复获取对象的当前状态。

相关问题