for…in 语句用于对数组或者对象的属性进行循环操作,而for循环是对数组的元素进行循环,而不能引用于非数组对象
for (变量 in 对象/数组)
{
代码区
}
for(int 变量初始值;条件;递增或递减){
在此执行代码
}
注意:
for-in的下标出来后停在数组最后一个下标上(即没有for里面最后的i++,即总是比最后一个下标大1),所以永远不能执行push操作,也就是永远跳不出while循环
例如:
function doubleball(){
/*6个红球,范围1~33之间,数字不能重复 升序排列*/
/*1个蓝球b,范围1~16之间 返回 红球字符串+|+b*/
var numArr=[];
while(numArr.length<6){
var r=parseInt((Math.random()*33+1));
// for(var i=0;i<numArr.length; i++)
for(var i=0 in numArr){
console.log('i:'+i);
if(r==numArr[i])break;
}
console.log('for:'+i,'len:'+numArr.length);
i==numArr.length&&numArr.push(r); // 永远不能执行,即死循环
}
}
doubleball();
改后代码为:
function doubleball(){
/*6个红球,范围1~33之间,数字不能重复 升序排列*/
/*1个蓝球b,范围1~16之间 返回 红球字符串+|+b*/
var numArr=[];
while(numArr.length<6){
var r=parseInt((Math.random()*33+1));
for(var i=0;i<numArr.length; i++){
if(r==numArr[i])break;
}
i==numArr.length&&numArr.push(r);
}
numArr.sort(function(a,b){return a-b});
var b=parseInt((Math.random()*16+1));
return String(numArr)+'|'+b;
}
document.write(doubleball());
总结:
想要获取到属性及相对应的值的时候for是办不到的,只有for in才可以,所以说,for in一般都是用在遍历对象的,另外,for in也可以遍历数组,但是会存在以下几个问题。
1、index索引为字符串型数字,不能直接进行几何运算
2、遍历顺序随机,有可能不是按照实际数组的内部顺序
3、使用for in会遍历数组所有的可枚举属性,包括原型。
如果是遍历普通数组的话,用for是最好的选择,但是如果是对象,就for in就好了