为什么控制台显示所有元素但长度为0

时间:2018-05-16 16:22:36

标签: javascript jquery

在我的代码中,我使用AJAX来填充一个数组,这是完美的工作,但是当我在其外部给出0时使用长度。

看看这段代码,评论显示我的意思。

$.ajax({
        url: "url",
        type : "GET",
        //contentType: "application/json",
        //dataType: "json",
        data : { firstDate : "date1",
                secondDate : "date2"}
                    //student_name : $('#id_student_name').val()
    }).then(function(data) {

        var obj = JSON.parse(data);
        obj.results.forEach(element => {
            console.log(element.DATEEND); 
            res.push(element);
            dates.push(element.DATESTART);
        });

    });
    var days = ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'];
    var i;

    function min_date(all_dates) {
        var min_dt = all_dates[0],
        min_dtObj = new Date(all_dates[0]);
        all_dates.forEach(function(dt, index){
            if ( new Date( dt ) < min_dtObj)
            {
                min_dt = dt;
                min_dtObj = new Date(dt);
            }
        });
        return min_dt;
    }

    var d = [];
    console.log(res.length + "    "); // this give 0
    for (var a = 0; a < res.length; a++) {
        d[a] = res[a].DATESTART;
        console.log(res[a].DATESTART);
    }
    console.log(d);//this is vide

    console.log(res); //this give all element

.
.
.

1 个答案:

答案 0 :(得分:0)

如果将非原始元素记录到控制台,则会存储其引用以进行记录。因此,控制台中显示的内容可能会反映对象的后期状态,然后在您执行日志记录时具有该状态。

fiddle具有相同的行为,没有任何异步代码:

var a = []
console.dir(a.length)
console.dir(a) // the array a does not have any elements a the time 
               // you do the logging but the console will show an
               // array with 10 elements
for (var i = 0; i < 10; i++) {
  a.push(1)
}

您甚至可以将其扩展为这样的示例:

var a = []
console.dir(a.length)
console.dir(a)
for (var i = 0; i < 4; i++) {
  a.push(1)
}
console.dir(a)
for (var i = 0; i < 4; i++) {
  a.push(2)
}

两个日志都将显示元素的最新状态,而不是记录的状态。因此,如果要查看元素所包含的实际值,则需要在日志记录后立即添加断点或debugger语句。或者您需要将对象转换为字符串。