从对象中排除变量

时间:2010-08-16 23:07:00

标签: javascript

基本上我理解你可以通过以下任何一种方式遍历数组。

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

2 个答案:

答案 0 :(得分:2)

不应使用for...in语句迭代数组。

引用Mozilla Dev Center

  

for ... in Statement

     


  尽管使用它作为迭代Array的方法可能很诱人,但这是一个坏主意。除了数组元素之外,for...in语句还会迭代用户定义的属性,因此如果您修改数组的非整数或非正属性(例如,通过向其添加“foo”属性,或者甚至通过添加方法或属性Array.prototype),for...in语句将返回除数字索引之外的用户定义属性的名称。

     

此外,由于迭代顺序是任意的,因此迭代数组可能无法按数字顺序访问元素。因此,在迭代数组时,最好使用带有数字索引的传统for循环。

答案 1 :(得分:1)

这正是您不应该使用for (i in array) ...构造的原因。 JavaScript数组的length属性在内部声明为不可枚举,因此当您遍历该对象时它不会出现,但定义的任何属性始终被枚举。

即将推出的ECMAScript 5可以将您自己的属性定义为不可枚举,但大多数浏览器尚不支持它。