基本上我理解你可以通过以下任何一种方式遍历数组。
var testarray = new Array(1,2,3,4);
for(i in testarray)console.log(testarray[i]);
//outputs 1,2,3,4
for(var i=0;i<testarray.length;i++) console.log(testarray[i]);
//outputs 1,2,3,4
我的问题如何复制/模拟该数组。是否支持for for循环方法?因为当我做同样的事情但我创建了自己的函数时,它包含了第1个循环中的长度。
function emulatearray(){
for(var i = 0;i<arguements.length;i++)this[i]=arguments[i];
this.length = i;
}
var testarray = new emulatearray(1,2,3,4);
for(i in testarray)console.log(testarray[i]);
//outputs 1,2,3,4,null
for(var i=0;i<testarray.length;i++) console.log(testarray[i]);
//outputs 1,2,3,4
答案 0 :(得分:2)
不应使用for...in
语句迭代数组。
for ... in Statement
尽管使用它作为迭代Array
的方法可能很诱人,但这是一个坏主意。除了数组元素之外,for...in
语句还会迭代用户定义的属性,因此如果您修改数组的非整数或非正属性(例如,通过向其添加“foo”属性,或者甚至通过添加方法或属性Array.prototype
),for...in
语句将返回除数字索引之外的用户定义属性的名称。此外,由于迭代顺序是任意的,因此迭代数组可能无法按数字顺序访问元素。因此,在迭代数组时,最好使用带有数字索引的传统for循环。
答案 1 :(得分:1)
这正是您不应该使用for (i in array) ...
构造的原因。 JavaScript数组的length
属性在内部声明为不可枚举,因此当您遍历该对象时它不会出现,但您定义的任何属性始终被枚举。
即将推出的ECMAScript 5可以将您自己的属性定义为不可枚举,但大多数浏览器尚不支持它。