对象和 console.log 的奇怪行为[重复]

问题描述 投票:0回答:2

此代码:

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/

这是为什么?

javascript google-chrome object
2个回答
191
投票

通过

console.log
检查对象以异步方式发生。控制台同步接收对象的引用,但在展开之前不会显示对象的属性(在某些情况下,取决于浏览器以及日志发生时是否打开了开发工具)。如果在控制台中检查对象之前已对其进行了修改,则显示的数据将具有更新的值。

例如,Chrome 会在一个框中显示一个小

i
,当鼠标悬停时,会显示:

左侧的对象值是记录时的快照,下面的值是刚刚评估的。

让您知道您在看什么。

在这些情况下记录的一个技巧是记录各个值:

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

或者 JSON 将对象编码为字符串:

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

或者 JSON 重新编码对象以保持其可检查性:

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

请注意,JSON 会删除所有不可序列化的属性,例如函数或 DOM 元素,并且在循环引用上失败,因此如果您有这些属性,则必须使用 deepCopy 的智能变体。


1
投票

重新定义

console.log
就能解决问题。

var originalLog = console.log;
console.log = function(obj) {
    originalLog(JSON.parse(JSON.stringify(obj)));
};
© www.soinside.com 2019 - 2024. All rights reserved.