cra*_*aft 2 javascript prototype
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]);
}
Run Code Online (Sandbox Code Playgroud)
当上面的代码执行时,它会正确地警告每个循环,但最后会弹出另一个警告,弹出Array.prototype.last方法的源代码.
每当我定义任何原型方法时都会发生这种情况,我只是不知道为什么!
所以我收到警报:0 = 1,1 = 2,2 = 3然后一个用于:
last=function () {
if (this.length != 0) {
return this[this.length - 1];
}
}
Run Code Online (Sandbox Code Playgroud)
这是因为该for-in语句枚举了对象属性,包括继承的属性.
这就是为什么使用for-in带有数组或类似数组的对象的语句被认为是一种不好的做法的原因之一.
其他原因包括规范不保证枚举的顺序,这意味着可能不会以数字顺序访问索引属性,例如:
var a = [];
a[1] = 'b';
a[0] = 'a'
for (var prop in a) { console.log(i); }
Run Code Online (Sandbox Code Playgroud)
大多数浏览器会检测到您正在尝试迭代数组,并且将按数字顺序访问属性,但在IE中,属性将按创建顺序枚举,1然后0.
同样众所周知,for-in语句可能比简单的顺序循环慢,因为正如您现在所知,它需要内省对象的整个原型链,以枚举继承的成员.
作为一般建议,始终使用顺序循环来迭代此类对象.
也可以看看: