Array.prototype.last = function() { if(this.length !=0) return this[this.length-1]; }
myarray = new Array(1,2,3);
for(var i in myarray){
alert(i+'='+myarray[i]);
}
当上面的代码执行时,它会正确地警告每个循环,但最后会弹出另一个警告,弹出Array.prototype.last方法的来源。
每当我定义任何原型方法时都会发生这种情况,我只是不知道为什么!
所以我得到警报:0 = 1,1 = 2,2 = 3然后一个用于:
last=function () {
if (this.length != 0) {
return this[this.length - 1];
}
}
答案 0 :(得分:6)
这是因为for-in
语句枚举对象属性,包括继承的属性。
这就是将for-in
语句与数组或类数组对象一起使用的原因之一被认为是一种不好的做法。
其他原因包括规范无法保证枚举的顺序,这意味着可能无法按数字顺序访问索引属性,例如:
var a = [];
a[1] = 'b';
a[0] = 'a'
for (var prop in a) { console.log(i); }
大多数浏览器会检测到您正在尝试迭代数组,并且将按照数字顺序访问属性,但在IE中,属性将按照创建顺序进行枚举,1
然后0
。
同样众所周知,for-in
语句可能比简单的顺序循环慢,因为正如您现在所知,它需要内省对象的整个原型链,以枚举继承的成员。
作为一般建议,请始终使用顺序循环迭代此类对象。
另见:
答案 1 :(得分:0)
这就是为什么你永远不会在javascript中使用for(idx in anArray){...}
for ... in循环迭代所有 object
中的属性和Array
在JS中只是一个object
,你为Array
的所有实例添加了一个新属性,因此它看起来像for循环中的一个索引。
通常你应该使用数组:
for(var i=0 ; i< anArray.length ; i++){
//do stuff
}
答案 2 :(得分:0)
这是因为last是myarray从原型属性派生的函数,并且是可索引的。为了避免这种情况,你需要检查hasOwnProperty,即:。
for(var i in myarray)
{
if(myarray.hasOwnProperty(i))
alert(i+'='+myarray[i]);
}