【问题标题】:When does the javascript console evaluate the contents of a printed object?javascript 控制台何时评估打印对象的内容?
【发布时间】:2015-08-07 06:19:12
【问题描述】:

我发现,在嵌套对象上使用 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

【问题讨论】:

  • 实际上,console.log object at current state 包含一个无效示例。也许从那以后的 4 年里,console.log 的行为发生了变化,但是当必须扩展对象以显示该值时,console.log 中的值对我来说是不同的。

标签: javascript


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-07-31
    相关资源
    最近更新 更多