for(i in array)和for(var i=0;i
for(i in array)和for(var i=0;i
这个问题已经有答案了:
对于所有的javascript/jQuery专家来说,这个问题都很容易。
我已经写了2年的javascript,今天我遇到了一个奇怪的问题。
我从我的C# Webmethod
获取一个JSON数组,然后用jQuery.ajax()
调用它。
当我执行
for (i in JSONRaw) {
Index = Index + 1;
$('#bottomGridDashboard').append('' + Index + '' + JSONRaw[i].DisplayName + '' + JSONRaw[i].SpeedInKPH + '
' + JSONRaw[i].DepotID + '' + JSONRaw[i].RouteID + '/' + JSONRaw[i].ScheduleID + '/' + JSONRaw[i].TripID + '' + JSONRaw[i].Direction + '' + JSONRaw[i].LastStop + ' ' + JSONRaw[i].ETAMinutes + '
'); }
附加的表会添加两行额外的行,每个字段的值为“undefined”。
然而,如果我将循环替换为
for (var i = 0; i < JSONRaw.length;i++ ) {
Index = Index + 1;
$('#bottomGridDashboard').append('' + Index + '' + JSONRaw[i].DisplayName + '' + JSONRaw[i].SpeedInKPH + '
' + JSONRaw[i].DepotID + '' + JSONRaw[i].RouteID + '/' + JSONRaw[i].ScheduleID + '/' + JSONRaw[i].TripID + '' + JSONRaw[i].Direction + '' + JSONRaw[i].LastStop + ' ' + JSONRaw[i].ETAMinutes + '
'); }
未定义的“undefined”行将消失。 看看这个图片
我很抱歉我的愚蠢,但我以前从未遇到过这样的问题。
可能的原因是什么?
编辑:
数组非常好,没有任何漏洞。
另一个观察结果是,未定义的属性仅出现在我的网格底部。 我认为它比数组长度多处理了两个额外的索引。
编辑2:
我的控制台.log向我显示了数组中的以下元素。
http://i.imgur.com/rI5TjdK.jpg
我已经在我的主页面中声明了原型。
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);
}
};
它是否增加了数组长度??
admin 更改状态以发布 2023年5月23日
这个问题已经有答案了:
对于所有的javascript/jQuery专家来说,这个问题都很容易。
我已经写了2年的javascript,今天我遇到了一个奇怪的问题。
我从我的C# Webmethod
获取一个JSON数组,然后用jQuery.ajax()
调用它。
当我执行
for (i in JSONRaw) { Index = Index + 1; $('#bottomGridDashboard').append('' + Index + '' + JSONRaw[i].DisplayName + '' + JSONRaw[i].SpeedInKPH + '' + JSONRaw[i].DepotID + '' + JSONRaw[i].RouteID + '/' + JSONRaw[i].ScheduleID + '/' + JSONRaw[i].TripID + '' + JSONRaw[i].Direction + '' + JSONRaw[i].LastStop + ' ' + JSONRaw[i].ETAMinutes + '
'); }
附加的表会添加两行额外的行,每个字段的值为“undefined”。
然而,如果我将循环替换为
for (var i = 0; i < JSONRaw.length;i++ ) { Index = Index + 1; $('#bottomGridDashboard').append('' + Index + '' + JSONRaw[i].DisplayName + '' + JSONRaw[i].SpeedInKPH + '' + JSONRaw[i].DepotID + '' + JSONRaw[i].RouteID + '/' + JSONRaw[i].ScheduleID + '/' + JSONRaw[i].TripID + '' + JSONRaw[i].Direction + '' + JSONRaw[i].LastStop + ' ' + JSONRaw[i].ETAMinutes + '
'); }
未定义的“undefined”行将消失。 看看这个图片
我很抱歉我的愚蠢,但我以前从未遇到过这样的问题。
可能的原因是什么?
编辑:
数组非常好,没有任何漏洞。
另一个观察结果是,未定义的属性仅出现在我的网格底部。 我认为它比数组长度多处理了两个额外的索引。
编辑2:
我的控制台.log向我显示了数组中的以下元素。
http://i.imgur.com/rI5TjdK.jpg
我已经在我的主页面中声明了原型。
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); } };
它是否增加了数组长度??
这两个循环有一些不同。
(1) 第一个应该是for (var i in JSONRaw)
。在window
上设置i
属性可能有一些不明显的后果。
(2) JSONRaw
不是数组,而是一个具有不明确定义的length
属性的对象。
(3) 在第一个循环中出现了在JSONRaw
上设置的其他属性。
(4) 数组可能存在“空洞”。例如,下面的数组在索引1
处有一个空洞。
var a = []; a[0] = 0; a[2] = 2;
第一种方法将省略1
。第二种方法将包括索引1
(其中a [1]
为undefined
)。
类似的情况可能发生如下:
var a = [0, 1]; a.length = 3;
个人认为是(3)。
在第一个循环中做一个console.log
可能会揭示问题。
编辑:从你的调试输出中,似乎(3)是罪魁祸首。inArray
和pushIfNotExist
是所有数组的键,因此第一个for
循环遍历了它们。
如果您要使用第一个循环,则有三个选项:
(1) 不要将这些函数添加到Array.prototype
。通常不建议添加到内置原型。
(2) 使用Object.defineProperty(在IE8中不起作用):
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) 检查在原型上是否定义了键。
for(var i in JSONRaw) { if(JSONRaw.hasOwnProperty(i)) { //do something } }
虽然大部分人只使用第二个循环,因为它具有更快的性能并且避免了可能的问题。
JavaScript中的for-in
和C#中的foreach
是截然不同的东西。不要在没有适当的保障措施的情况下使用for-in
循环遍历数组,这不是它的用途。它循环遍历对象的可枚举属性,而不是数组索引或元素。
要么使用必要的保障措施,要么使用类似于第二个示例的通用的for
,或者(如果可以依赖)使用Array#forEach
。
单独提一下:确保你在某个地方声明了i
(在你的第一个示例中似乎没有声明)。如果没有的话,你就会深陷隐式全局变量的恐怖。
我已经在我的Master页中声明了原型。
Array.prototype.inArray = function ...
这就是为什么不使用没有保障措施的for-in
循环遍历数组。同样,请参见上面的链接。你的for-in
循环将循环遍历数组索引属性("0"
、"1"
等——是的,它们真的是字符串),还有你添加到Array.prototype
中的函数名称(inArray
等)。