在js中的几种常用循环方法
- for循环
- while循环
for循环
最常用的循环语句,使用时需要注意:第一点,最好使用es6 声明变量,这样是为了防止产生闭包问题。至于什么是闭包大家自己百度一下有很多详细的解释。第二点,循环范围最好设置为一个变量,我们或许会经常这样使用
for(let i=0;i<a.length;i++){
}
这样做有一点不好,那就是每次循环都要计算a.length,可以这样优化:
let len = a.length;
for(let i=0;i<len;i++){
}
这样看,每次虽然不用再计算a.length,但是要判断i<len,所以还能这样:
let len = a.length;
for(let i = len;i--;){
}
while循环
如果我们要对数组进行增删操作,一定会影响到数组的长度变化。例如我想在数组中去除值为2的数:
let arr = [1,2,2,2,2,1,1,1,2,2];
let t = arr.length;
for(let i=0;i<t;i++ ){
if(arr[i] == 2){
arr.splice(i,1);
}
}
console.log(arr);
打印结果却是 [1, 2, 2, 1, 1,1, 2],原因就是每次匹配到一个符合的条件后,后面的每一项都上升一位,跳过了下一项的检查。
let arr = [1,2,2,2,2,1,1,2,2];
let t = arr.length;
while(t--){
if(arr[t] == 2){
arr.splice(t,1);
}
}
console.log(arr);
这样的输出结果就是 [1,1,1]了。当然,你也可以修改for循环,像上面最后优化的逆序,效果都是一样的。另外值得一说的是,逆序相对于正序能后节省一些时间,当然这个一些其实是可以忽略不计的,逆序循环的使用,有些影响代码的可读性,所以在不是要求极端优化的情况下,我们正常使用正序就可以。
其他的循环语句
for-in 语句通常被用来遍历对象,它的格式是这样的
for(keys in zhangsan){}
for(keys in object){
//dosomething
}
遍历时不仅能读取对象自身上面的成员属性,也能延续原型链遍历出对象的原型属性,所以可以使用hasOwnProperty判断一个属性是不是对象自身上的属性。
for-of允许遍历获得键值(这俩个通常都用不到,而且性能都很低)。
还有一个do-while语句
do{
//dosomething
}while(条件判断);
do-while 它的运行机制是先执行一遍do 再进行判断,所以即使没有条件满足,它也至少执行一次。
循环控制
break:跳出当前所在循环,继续执行循环后面的语句。如果循环有多层,则break只能跳出一层。
continue:跳过本次循环剩余的代码,继续执行下一次循环。
for(var i = 1; i < 10; i++){
if(i == 4){
continue;
}
console.log(i);//1 2 3 5 6 7 8 9
}
for(var i = 1; i < 10; i++){
if(i == 4){
break;
}
console.log(i);//1 2 3
}