<script type="text/javascript">
var x
var mycars = new Array()
mycars[0] = "Saab"
mycars[2] = "Volvo"
mycars[4] = "BMW"
<!--for (y in mycars)
{
document.write(mycars[y] + "<br />")
}
alert(mycars.length);
-->
for(var i=0;i<mycars.length;i++){
document.write(mycars[i] + "<br />")
}
</script>
为什么for in输出的话没有undefined
而for会输出undefined值呢?
他们在实际应用中有哪些区别?
for:
Saab
undefined
Volvo
undefined
BMW
for in:
Saab
Volvo
BMW
for in 语法遍历一个对象的可枚举属性
for 按设置的条件循环执行包含的语句块
var mycars = new Array()
mycars[0] = "Saab"
mycars[2] = "Volvo"
mycars[4] = "BMW"
对于数组对象mycars来说其长度为5,有“1”,“2”,“4”这3个可枚举属性
所以
for (y in mycars){
console.log(mycars[y]);
}
可输出Saab,Volvo,BMW
而当
for (y=0;y<mycars.length;y++){
console.log(mycars[y]);
}
mycars.length值为5,y值分别为0,1,2,3,4
mycars[y]相当于在执行mycars[String(y)]
1,3下标处没有定义值,为undefined
输出结果为Saab,undefind,Volvo,undefined,BMW
for in 一般是来遍历对象的
如果你不把数组当成一个对象去遍历,那就用for
可以遍历所有的索引
答案就是,本质上你可以把数组看成下面的样子:
var mycars = {
"0": "Saab",
"2": "Volvo",
"4": "BMW"
};
下面是原答案,可以不用看了!
因为for in
实际上是去遍历对象
的可枚举属性,它会把你给它的操作数当成对象,管你是不是数组呢。
对于数组这个特殊对象,通常它的可枚举属性就是'0'、'1'、'2'...这些字符串。
而你代码中的那个数组,只定义了0、2、4这三个属性,当然for in只能遍历出这三个值。
而你的for循环,通过对i
进行自增运算,强制去取了从0到4的所有属性,所以1和3那两个没有定义的属性(undefined)就被打印出来了。
所以,关键点就是:
数组就是对象而已!
for in
是用来遍历对象属性的。
数组也是一个对象,并且是一个内建的Array对象实例。 for in 遍历非自定义的对象时,只能获取到指定的属性。对于你提供的数组就是0, 2, 4。
可以对于普通的循环,还会访问不存在的属性,1和3,所以会有undefined.
对于Array内部的实现不太了解,仅仅是从对象的属性访问角度来分析这个问题。仅供参考
for一般对数组使用,for..in一般是对json对象使用
你在for输出undefined因为循环的判断条件写错了,应该是i<mycars.length-1
都差不多,按字面的意思,for就是循环,for in 就是在(a1,a2,a3...)里面循环
用得最多的难道不是forEach?