for循环
表达式一般如下:
for(表达式1;表达式2;表达式3){
表达式4;
}
执行的顺序为:
1)第一次循环,即初始化循环。
首先执行表达式1(一般为初始化语句),再执行表达式2(一般为条件判断语句)。如果符合,则执行表达式4,最后执行表达式3。否则,停止执行。
2)下次的循环:
首先执行表达式2,判断是否符合表达式2的条件;如果符合,继续执行表达式4,最后执行表达式3。否则停止执行。
for...in
表达式一般如下:
for(a in 对象){
表达式1;
}
此处的a是对象中的key(键名)。
遍历对象:
var arr={
name: "Peter",
age:18,
address:"beijing"
};
for(var i in arr){
console.log(i);//name,age,address
}
for(var i in arr){
console.log(arr[i]);//name,age,address
}
Array.prototype.number="2018";//为arr原型添加一个number属性
for(var i in arr){
console.log(i);//name,age,address,number
}
遍历数组:
// 遍历出来的索引是key值
// meMethod 这个原型对象上的属性也会被遍历出来
// 出来的顺序也不一定是原先书写的顺序
var arr = [1, 2, 3];
Array.prototype.myMethod = function () {
console.log(this.length);
};
for(i in arr){
console.log(i);//0,1,2,myMethod
}
for(i in arr){
console.log(arr[i]);//1,2,3,4
}
- 一般用于遍历对象的可枚举属性。以及对象从构造函数原型中继承的属性。对于每个不同的属性,语句都会被执行(因为是key,所以直接得到的是属性名)
- 当使用for in遍历数组时,和遍历对象的行为一样,会遍历数组所有可枚举的属性,所以原型对象上的方法和属性也会被遍历(数组遍历直接得到的是索引,属性直接遍历得到的是属性名)
- 遍历的顺序可能不是按照实际数组的内部顺序
- 如果迭代的对象的变量值是null或者undefined, for in不执行循环体,建议在使用for in循环之前,先检查该对象的值是不是null或者undefined
注意:遍历得到的Key都是String类型,不可直接用于数值计算
综上所述:不建议使用for...in遍历数组!
for...of
表达式一般如下:
for(a of 对象){
表达式1;
}
看着和for...in很像,但是此处的a是对象中的value(值)。
for...of
专注于遍历的value
值的同时,不会发生原型对象,和对象本身的属性被遍历出来的问题。同样是for...in的例子,它不会遍历出meMethod的值。
for...of相比于for...in更适合遍历数组