Firefox console.table显示错误数据

时间:2018-12-15 14:15:38

标签: javascript firefox multidimensional-array console.log

让我们尝试以下javascript代码:

@POST("account/login")
Call<ResponseBody> loginwithno(@Body SendLoginData post);

这是结果:

Resulting Matrix

我已经使用 Firefox 64.0 测试了此功能。 为什么两个 var Matrix = [ [1,2,3], [4,5,6] ]; console.table(Matrix); // print initial data Matrix[1][1] = 9; // change one value console.table(Matrix); // print updated data 调用都导致相同的输出?

2 个答案:

答案 0 :(得分:0)

console.log不是标准化的,因此行为相当不确定,

控制台将需要将记录的值存储在某个地方,并将其显示在屏幕上。渲染将肯定会异步发生(受速率限制更新),将来与控制台中记录的对象进行交互(例如扩展对象属性)也会如此。

因此,控制台可以克隆(序列化)您记录的可变对象,也可以存储对它们的引用。第一个不适用于深层物体。另外,至少控制台中的初始渲染可能会显示对象的“当前”状态,即记录时的状态-在您的示例中,您看到对象{}。 提醒多维数组也是对象

但是,当您扩展对象以进一步检查其属性时,控制台很可能只存储了对您的对象及其属性的引用,现在显示它们将显示其当前(已变异)状态。

此答案受Bergis问题的this答案的影响。

答案 1 :(得分:0)

console.table不是同步的,因此在显示Matrix的初始内容之前,更新已完成。 只需添加这样的延迟,您就会看到两个值正确显示:

var Matrix = [
  [1, 2, 3],
  [4, 5, 6]
];

console.table(Matrix);   // print initial data
setTimeout(() => {
  Matrix[1][1] = 9;        // change one value
  console.table(Matrix);   // print updated data
}, 2000);

这当然是不切实际的,但是在mozilla网站上看到它说 注意:Web Workers中提供了此功能。 但是法语翻译说,该功能可以通过网络工作者获得,这将解释您所看到的行为。

一种解决方法是在Matrix的深层副本上调用console.table,以便您可以对其进行修改,而对最终代码的影响最小。