测试以下内容:
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中遇到了相同的提升问题。
这是一个错误吗?
答案 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)
就像是当时参考文献的快照。这样您就无法在控制台中看到以后完成的更新