为什么console.log()和console.dir()记录不存在的对象属性?

时间:2015-11-25 06:58:53

标签: javascript console console.log

测试以下内容:

var o = {};
console.log(o);
o.prop = 'value';

在Firefox 42.0中,如果单击控制台中显示的对象,您应该感到震惊。在Firebug 2.0.13中测试,以及常规控制台。

更令人震惊,测试一下:

var o = {prop:'test'};
console.log(o);
o.prop = 'value';

我无法使用上面的代码在最新的Microsoft Edge中重现此问题,但我能够使用更广泛的代码产生相同的问题。

使用更大的面向对象的JavaScript程序(使用Construtors),我还使用console.dir()对此进行了测试,并在Microsoft Edge和Firefox中遇到了相同的提升问题。

这是一个错误吗?

3 个答案:

答案 0 :(得分:1)

这不是一个错误,虽然它可能被认为是不直观的。当您检查已记录的对象时,您正在检查它当前存在的 而不是记录它时的状态。要保持富检查忽略将来的修改,您必须记录该对象的深层副本,这是不容易的。

在这个例子中,一个快速(可枚举的自己的属性 - 仅限于一个新的Object)浅拷贝工作,但是:

function copyObject(obj) {
    var result = {};

    Object.keys(obj).forEach(function (key) {
        result[key] = obj[key];
    });

    return result;
}

var o = {};
console.log(o);
console.log(copyObject(o));
o.prop = 'value';

答案 1 :(得分:0)

只是评论:

    $('.withsub a').on('click', function () {
    if ($(this).siblings('.tmenu-subs02').is(':visible')) {
        $(this).siblings('.tmenu-subs02').hide();
        $('.withsub').removeClass('clicked');
    } else {
        $(this).siblings('.tmenu-subs02').show();
        $('.withsub').addClass('clicked');
    }
});

结果:

var o = {};
console.log('logged' + o);
o.prop = 'value';

那么,你在哪里看到它的记录和价值'?

答案 2 :(得分:-1)

您必须在console.log()console.dir()函数之间混淆。

console.log(o)打印对象引用。因此,当您在控制台中展开它时,您将看到到目前为止已完成的所有更新

console.dir(o)就像是当时参考文献的快照。这样您就无法在控制台中看到以后完成的更新