Difference between for(i in array) and for(var i=0;i<array.length;i++)
对于所有的javascript/jquery用户来说,这是一个非常简单的问题。
我在过去的两年中一直在编写JavaScript,今天我遇到了一个奇怪的问题。
我正在从我的
当我这样做的时候
1 2 3 4 | for (i in JSONRaw) { Index = Index + 1; $('#bottomGridDashboard').append('<tr> <td>' + Index + '</td> <td>' + JSONRaw[i].DisplayName + '</td> <td>' + JSONRaw[i].SpeedInKPH + '</td> <td><img src="' + JSONRaw[i].ImageURL + '" height="20px" alt="" /></td> <td>' + JSONRaw[i].DepotID + '</td> <td>' + JSONRaw[i].RouteID + '/' + JSONRaw[i].ScheduleID + '/' + JSONRaw[i].TripID + '</td> <td>' + JSONRaw[i].Direction + '</td> <td>' + JSONRaw[i].LastStop + '</td> <td> ' + JSONRaw[i].ETAMinutes + ' </td> </tr>'); } |
附加的表增加了两行,将每个字段都设置为"未定义"。看到这个图像
但是,如果我用
1 2 3 4 | for (var i = 0; i < JSONRaw.length;i++ ) { Index = Index + 1; $('#bottomGridDashboard').append('<tr> <td>' + Index + '</td> <td>' + JSONRaw[i].DisplayName + '</td> <td>' + JSONRaw[i].SpeedInKPH + '</td> <td><img src="' + JSONRaw[i].ImageURL + '" height="20px" alt="" /></td> <td>' + JSONRaw[i].DepotID + '</td> <td>' + JSONRaw[i].RouteID + '/' + JSONRaw[i].ScheduleID + '/' + JSONRaw[i].TripID + '</td> <td>' + JSONRaw[i].Direction + '</td> <td>' + JSONRaw[i].LastStop + '</td> <td> ' + JSONRaw[i].ETAMinutes + ' </td> </tr>'); } |
未定义的行消失..看到图像
我为自己的愚蠢道歉,但我以前从未遇到过这样的问题。原因可能是什么??
编辑:
阵列非常好。而且里面没有洞。另一个观察是未定义的属性只出现在网格的底部。我认为它正在处理超过数组长度的两个额外索引。
编辑-2
我的console.log向我展示了数组中的以下元素。
网址:http://i.imgur.com/ri5tjdk.jpg
我已经在主页上声明了原型。
1 2 3 4 5 6 7 8 9 10 11 12 13 | Array.prototype.inArray = function (comparer) { for (var i = 0; i < this.length; i++) { if (comparer(this[i])) return true; } return false; }; Array.prototype.pushIfNotExist = function (element, comparer) { if (!this.inArray(comparer)) { this.unshift(element); } }; |
是增加数组长度吗????
javascript的
要么使用必要的保护措施,要么像第二个例子一样使用通用的
更多信息,请回答,并在我的博客上。
另外:一定要在某个地方声明
I've declared the prototypes in my Master page.
Array.prototype.inArray = function ...
这就是为什么您不使用
这两个循环有几种不同的方式。
(1)第一个应该是
(2)
(3)在第一个循环中出现的
(4)阵列可以有"孔"。例如,下面的数组在索引
1 2 3 | var a = []; a[0] = 0; a[2] = 2; |
第一种方法是省略
类似情况可能发生如下:
1 2 | var a = [0, 1]; a.length = 3; |
我个人怀疑(3)。
在第一个循环中执行EDOCX1[11]可能会发现问题。
编辑:从您的调试输出来看,(3)似乎是罪魁祸首。
如果要使用第一个循环,则有三个选项:
(1)不要在
(2)使用
1 2 3 4 5 6 7 8 9 | Object.defineProperty(Array.prototype, 'inArray', { enumerable: false, //this makes it not show up in the for loop value: function (comparer) { for (var i = 0; i < this.length; i++) { if (comparer(this[i])) return true; } return false; } }); |
(3)检查是否在原型上定义了密钥。
1 2 3 4 5 | for(var i in JSONRaw) { if(JSONRaw.hasOwnProperty(i)) { //do something } } |
尽管大多数人使用第二个循环只是因为潜在的缺陷(以及更快的性能)。
简言之,