flash,for,for in,for each in,这到底是为什么呢?

来源:百度知道 编辑:UC知道 时间:2024/05/10 18:51:49
var testArr:Array = new Array();
for(var i:Number = 0; i < 10000; i++)
{
testArr.push(i);
}
var len:Number = testArr.length;
for(var j:Number = 0; j < len; j++)
{
trace(testArr[j]);
testArr[j]++;
}
for(var k:String in testArr)
{
trace(testArr[k]);
testArr[k]++;
}
for each (var m:Number in testArr)
{
trace(testArr[m]);
m++;
}
无论testArr.length的值有多小,值有多大.在这三个for之中,随便先一个来做,就正常输出.
如果把三个加在一起来做.就会出现两个undefined啊.
如果用for in 与 for each in来做,还是会出现一个undefined啊.
这是为什么呢?
.
.
还有一个,在for in里面k:String ,k是String呀,为什么后面可以用数组的形式呢?testArr[k]

1. 关于为什么k:String也可以当下标用,这是因为AS是动态语言,其数组的内部实现实际上是哈希表,其键都是以字符串形式保存的,数组允许用数值作下标进行访问实际上也是通过把数值下标转化为字符串来进行的。也就是说,testArr[10]和testArr["10"]完全等价。

2. 首先要搞清楚for...in和for each...in的区别。按照上面说的数组是哈希表,于是就很容易理解他们的区别:for...in是遍历键,for each...in是遍历值。所以在上面的for each循环里,m是这个数组中的一个个值,因此把它当作下标来用( testArr[m] )就是概念错误。出现undefined的原因就在这里。前两个循环都没错,但每一个循环都把所有元素的值增大1,因此两个循环过后,元素的值就是从2到10001而不是0到9999,因此for each循环实际上就是输出testArr[2], testArr[3], ... testArr[10001],显然最后两个是没有定义的。如果只有for...in一个循环的话,所有元素值都加1,因此就是一个undefined。