我发现在嵌套对象上使用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位置的值,而是在第二个示例中?
答案 0 :(得分:0)
大多数浏览器仅在展开对象时获取登录到控制台的对象的属性 - 并且经常在对象引用旁边的工具提示中注意这一点。
它们也倾向于仅在第一次扩展对象并从那时开始缓存,因此控制台不是检查对象的可靠方法。
为了解决这个问题,浏览器提供了一个更频繁更新的监视面板,可以与断点或步进一起使用来重复获取对象的当前状态。