Javascript数组长度为0

时间:2017-06-08 10:24:43

标签: javascript

我对以下内容有一些奇怪的行为,它显示数组长度为0,尽管在此之前打印它显示明显长度大于0:

var getTopSelection = function(callback) {
    var topSelection = [];
    for(var i=0; i < markers.length; i++) {
        if(markers[i].map !== null) {
            var stationID = markers[i].id;
            getTrips(stationID, globalFromDate, globalToDate, function(response) {
                topSelection.push({
                    StationID: stationID,
                    Trips: response
                });
            }, function(error) {
                console.log(error);
            })
        }
    }
    callback(topSelection);
};

getTopSelection(function(response) {
            console.log(response); //115
            console.log(response.length); //116
})

这在检查员中显示,“长度:42”属于第115行。

enter image description here

问题:为什么它显示的长度为0,尽管它之前明确表示它的长度为42行?

3 个答案:

答案 0 :(得分:4)

console.log is not synchronous

console.log语句在您调用getTrips之后但在getTrips回调被触发之前显示。

实际上,您正在尝试return the response from an asynchronous call

response对象。 JS中的对象始终被引用。您正在记录该引用,然后在getTrips回调触发时使用新值(以及新长度)更新对象。新对象将反映在控制台中。

response.length是一个数字。你正在记录它。数值不是参考。它是0,因为当时您致电console.log它是0。当值更改时,显示不会更新,因为它是数字而不是对象。

答案 1 :(得分:1)

所以实际发生的是当你记录你的响应它实际上长度为0.但是在返回异步响应之后它有42个项目但是长度是一个属性被记录为数字。但是,作为对象的响应最初会记录为零项。但是当收到实际响应时,对响应对象的引用会更新,并且您会看到响应有42个项目,长度也是42.以下代码是setTimeout之后显示的示例。调用已记录的响应在控制台中更新。

&#13;
&#13;
var getTopSelection = function(callback) {
    var topSelection = [];
    markers=[1,2,3,4,5,6,7,8,9];
    for(var i=0; i < markers.length; i++) {
        if(markers[i].map !== null) {
            var stationID = markers[i].id;
            getTrips(stationID, function(response) {
                topSelection.push({
                    StationID: i,
                    Trips: response
                });
            }, function(error) {
                console.log(error);
            })
        }
    }
    callback(topSelection);
};

function getTrips(station,fun){
setTimeout(function(){
	fun(["trip1","trip2","trip3"]);
},1000)
}
getTopSelection(function(response) {
            console.log(response); //115
            console.log(response.length); //116
})
&#13;
&#13;
&#13;

尝试在Fiddle here中执行此代码段(已相应修改以显示实际发生的情况)。并在stackoverflow片段结果中观察控制台中的输出,它将不可见。这是控制台输出的快照

enter image description here

希望有所帮助:)

答案 2 :(得分:-2)

Array Length returns 0

您似乎正在尝试查找对象的长度,而不是实际的数组。