对象的奇怪行为&console.log

slsn1g29  于 2021-09-23  发布在  Java
关注(0)|答案(2)|浏览(433)

此问题已在此处找到答案

chrome的javascript控制台在评估数组方面懒惰吗((七个答案)
去年关闭。
此代码:

foo = [{id: 1},{id: 2},{id: 3},{id: 4}, {id: 5}, ];
console.log('foo1', foo, foo.length);
foo.splice(2, 1);
console.log('foo2', foo, foo.length);

在chrome中生成以下输出:

foo1 
[Object, Object, Object, Object, Object]  5
    0: Object
    1: Object
    2: Object
    3: Object
    length: 4
    __proto__: Array[0]
     5 (index):23
foo2 
[Object, Object, Object, Object]  4
    0: Object
    1: Object
    2: Object
    3: Object
    length: 4
    __proto__: Array[0]

小提琴:http://jsfiddle.net/2kpnv/
为什么呢?

bxfogqkk

bxfogqkk1#

通过 console.log 以异步方式发生。控制台同步接收对对象的引用,但在对象展开之前不会显示对象的属性(在某些情况下,取决于浏览器以及日志发生时是否打开了开发工具)。如果在控制台中检查对象之前对其进行了修改,则显示的数据将具有更新的值。
例如,chrome会显示一点 i 在一个框中,当鼠标悬停时,显示:
左边的对象值是在记录时拍摄的,下面的值刚刚计算过。
让你知道你在看什么。
在这些情况下,记录的一个技巧是记录单个值:

console.log(obj.foo, obj.bar, obj.baz);

或json编码对象引用:

console.log(JSON.stringify(obj));
h5qlskok

h5qlskok2#

重新定义 console.log 这将解决问题。

var originalLog = console.log;
console.log = function(obj) {
    originalLog(JSON.parse(JSON.stringify(obj)));
};

相关问题