Javascript for循环中的数组长度错误

Javascript for循环中的数组长度错误,javascript,Javascript,在包含对象数组的for循环中,我面临一种奇怪的行为 下面是一个例子 var store = {}; var storesWithTimestamps = []; for (var i=0;i<2;i++){ console.log("inital list",storesWithTimestamps); //1 console.log("inital length",storesWithTimestamps.length); /

在包含对象数组的for循环中,我面临一种奇怪的行为

下面是一个例子

var store = {};
var storesWithTimestamps = [];

for (var i=0;i<2;i++){                      
    console.log("inital list",storesWithTimestamps); //1
    console.log("inital length",storesWithTimestamps.length); //2

    store = {};
    store.latestTimestamp = null;
    store.storeName = "testStore";
    storesWithTimestamps.push(store);

    console.log("new list",storesWithTimestamps); //3
    console.log('new length',storesWithTimestamps.length); //4
}
第二圈:

[{latestTimestamp:null,storeName:"testStore"},{latestTimestamp:null,storeName:"testStore"}]
仅供参考:这在Safari中可以正常工作,但在chrome-OSX上不能 附小提琴:


附加屏幕截图:

实际上这是由于调试器行为造成的

如果在运行脚本时打开了调试器,则控制台中的输出将是正确的

如果在运行脚本时未打开调试器,则将在显示控制台时计算对象。这就是为什么在阵列中可以看到2个对象

我想这就是“约林”的意思

增编: 您可能希望使用
JSON.stringify()
方法记录即时对象属性:

console.log( "inital list:", JSON.stringify( storesWithTimestamps ) ) //1
...
console.log( "new list:", JSON.stringify( storesWithTimestamps ) ) //3
Nota bene: 在控制台中,斜体值立即计算,而非斜体值在显示时计算(如值旁边的蓝色[i]所示)

结论:
在第二个发布的屏幕截图中,我们可以清楚地看到这不是一个Chrome bug。

我已经试过了……就像@yorlin和@Supersharp所说的那样

您可以在控制台中更清楚地查看它

var store = {};
var storesWithTimestamps = [];

//Checkout the status of ary
function displayObj(objAry){
    var info="\n";
    for(var i=0;i<objAry.length;i++){
        var data=objAry[i];
        info+='\t\trecord('+i+').id:'+data.id+'\n';
    }
    return info;
}

for (var i=0;i<2;i++){                      
    console.log("inital list",storesWithTimestamps); //1
    console.log("inital length",storesWithTimestamps.length); //2

    //put an id to identify
    store = {id:i};
    store.latestTimestamp = null;
    store.storeName = "testStore";
    storesWithTimestamps.push(store);

    console.log("new list",displayObj(storesWithTimestamps)); //3
    console.log('new length',storesWithTimestamps.length); //4
}
var-store={};
var storesWithTimestamps=[];
//检查ary的状态
功能显示OBJ(objAry){
var info=“\n”;

对于(var i=0;i这是由于console.log()的异步特性造成的) 有关此行为的更多详细信息,请访问

您可以尝试解决方法来记录正确的值,如下所示-

var-store={};
var storesWithTimestamps=[];

对于(var i=0;i?在Chrome中看起来很好。cose很好,它在Chrome上工作。我投票赞成结束,因为我无法重现这个问题。我实际上可以在js fiddle的控制台中看到它。但它只是第一次运行。数组已经有2个元素。这是由于javascript引用指向对象,所以更改了对象导致在控制台中更改它。尝试将调试器放置在循环中,并查看输出将如何逐步更改。在我的情况下,我已打开调试器并运行脚本,无论发生什么都是一样的。@Gaurav_soni,您确定在重新加载页面之前已清除日志窗口吗?可能您的浏览器有问题,因为没有人看起来是错误的le在控制台打开的情况下复制该行为。我在Chrome 46和Firefox上测试了它,得到了预期的结果。是的,在控制台打开/关闭的情况下尝试了,重新启动了浏览器。同样的代码在safari和Firefox中工作正常。在OSX上应该是浏览器问题,@sirrocco似乎也面临同样的问题。你是在windows还是mac上?我在一个浏览器上尝试了它windows机器也存在同样的问题。打开控制台后,新列表日志将在第一次迭代期间显示这两个值。
var store = {};
var storesWithTimestamps = [];

//Checkout the status of ary
function displayObj(objAry){
    var info="\n";
    for(var i=0;i<objAry.length;i++){
        var data=objAry[i];
        info+='\t\trecord('+i+').id:'+data.id+'\n';
    }
    return info;
}

for (var i=0;i<2;i++){                      
    console.log("inital list",storesWithTimestamps); //1
    console.log("inital length",storesWithTimestamps.length); //2

    //put an id to identify
    store = {id:i};
    store.latestTimestamp = null;
    store.storeName = "testStore";
    storesWithTimestamps.push(store);

    console.log("new list",displayObj(storesWithTimestamps)); //3
    console.log('new length',storesWithTimestamps.length); //4
}