Javascript 为什么这个代码打印20未定义?

Javascript 为什么这个代码打印20未定义?,javascript,object,return,iteration,undefined,Javascript,Object,Return,Iteration,Undefined,: 为什么20个未定义 var coordinateTratte = {"1522-nord":[{"Distanza":0,"Lat":45.02915,"Lng":7.606131667},{"Distanza":0.1,"Lat":45.02805167,"Lng":7.605818333}]}; for (var key in coordinateTratte) { var obj = coordinateTratte[key]; for (var i = 0; i &

:

为什么20个未定义

var coordinateTratte = {"1522-nord":[{"Distanza":0,"Lat":45.02915,"Lng":7.606131667},{"Distanza":0.1,"Lat":45.02805167,"Lng":7.605818333}]};

for (var key in coordinateTratte) {
    var obj = coordinateTratte[key];
    for (var i = 0; i < obj.length; i++) {  
        console.log(obj[i].Lat);
    }
}
小提琴:

试试:

for (var key in coordinateTratte) {
    var obj = coordinateTratte[key];
    for (var prop in obj) {  
        if(obj.hasOwnProperty(prop))
            console.log(obj[prop].Lat);
    }
}
迭代所有数组属性。即使它们来自它的原型。

1522 nord是一个数组,您可以使用for-in遍历它。不要在阵列上使用for in。使用常规循环:

for (var key in coordinateTratte) {
    var obj = coordinateTratte[key];
    for (var i = 0; i < obj.length; i++) { // <--
        console.log(obj[i].Lat);
    }
}

@在我看来,user1689607的评论就是答案。当您选择no-lib-pure-JS时,您的代码不会记录任何未定义的值。问题是:libs经常摆弄原生类型的原型。最臭名昭著的lib是prototype.js,线索就在名称中。例如,一个常规的、未改变的数组对象的神奇属性是不可枚举的,即:不会出现在数组的for…in循环中。但是,当您开始添加自己的属性和方法时,它们很可能会出现。由于数组是从对象原型派生的,因此对该原型的任何修改也可能会显示出来

它的长短不一是:永远不要在数组中使用。如果在对象上使用for…in,请始终检查您正在处理的任何属性是否直接在该对象上设置,并且不是来自原型:

for (var prop in someObject)
{
    if (someObject.hasOwnProperty(prop))
    {
        //do stuff
    }
}

就数组而言:forvar i=0;i+1:-]此外,您可以使用,以便清楚地了解您的结构,并查看何时应该循环槽对象以及何时使用数组。-1不要在数组中使用in,即使它有效。顺便说一句。对于数组,如果代码不必在旧IE上运行,最好使用simple for loop或forEach方法。@David:不要在数组上使用for-in,即使它可以工作。为什么?只是好奇…@markzzz它冗长、不可读,您需要使用.hasOwnProperty方法。此外,如果初学者看到这一点,他们可能会在自己的程序中错误地模仿它。是的,有效:您加载了MooTools,正如其他人所示,您没有正确地迭代数组。当您使用JSFIDLE时,最好先在左侧设置适当的设置,比如从菜单中选择No Library pure JS。这是一个愚蠢的问题吗-3.英雄联盟
for (var prop in someObject)
{
    if (someObject.hasOwnProperty(prop))
    {
        //do stuff
    }
}
var normalArray = [1,2];
var sparseArray = [1,2,3,4];
delete sparseArray[2];//will log [1,2,undefined,4]
for (var i=0;i<sparseArray.length;i++)
{
    if (i < normalArray.length)
    {
        console.log(normalArray[i]);
    }
    console.log(sparseArray[i]);//will log 1 - 2 - undefined - 4
    if (sparseArray.hasOwnProperty(i))
    {
        console.log(sparseArray[i]);//logs 1 - 2 - 4
    }
}