对象和console.log的奇怪行为

dan*_*son 91 javascript google-chrome object

这段代码:

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);
Run Code Online (Sandbox Code Playgroud)

在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]
Run Code Online (Sandbox Code Playgroud)

小提琴:http://jsfiddle.net/2kpnV/

这是为什么?

zzz*_*Bov 136

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

例如,Chrome会i在一个盒子中显示一点,当它悬停时,会说:

记录时左边的对象值被快照,刚才评估了下面的值.

让你知道你在看什么.

记录这些情况的一个技巧是记录单个值,或者JSON编码对象引用:

console.log(obj.foo, obj.bar, obj.baz);
Run Code Online (Sandbox Code Playgroud)

  • 如另一个答案中所述,`JSON.parse(JSON.stringify(obj))`可能会更好地将日志视为json对象而不是字符串 (14认同)
  • Chrome执行此操作的原因是什么,而不是显示记录时的值?那不是更有用吗? (10认同)
  • 或:console.log(Object.assign({},obj)); - 这将创建一个新的对象副本. (4认同)
  • @cimak,由于某种原因,当使用`console.log(Object.assign({},obj))`时,我仍然得到一个显示其属性的最后值的对象.使用`console.log(JSON.parse(JSON.stringify(obj)))`确实显示输出时的值. (3认同)
  • @Peter - 我部分错了,`Object.assign`只适用于只包含原始值的对象(因为`Object.assign`使浅拷贝,而不是深拷贝).如果`obj`包含另一个对象,那么该嵌套对象的值将被单独"评估". (3认同)

归档时间:

查看次数:

40510 次

最近记录:

6 年,4 月 前