循环是唯一能够导致应用程序反复执行一段代码的结构,如何以及何时使用每一种循环是创建高质量软件的一个决定性因素.

循环的种类

  • 计数循环: 执行的次数是一定的,可能是针对每位子元素执行一次;
  • 连续求值的循环: 预先并不知道要执行多少次,会在每次迭代的时候检查是否需要结束’
  • 无限循环: 一旦启动,就会一直执行下去
  • ‘迭代器循环 : 对容器里面的每个子元素执行一次操作

image.png
image.png

循环的选择

什么时候使用while循环

  • 预先并不知道要循环多少次
  • 检测位于循环的开始
  • 检测位于循环的结束

什么时候用带退出的循环(break; return)

  • 带退出的循环就是终止条件出现在循环中间而不是开始或者末尾的循环

    正常带退出的循环

    image.png
    带退出循环的使用场景:
    image.png
    优化后:
    image.png

    非正常的带退出的循环

  • 先执行goto start

  • 其次执行 do something else
  • 最后执行 do something

image.png
image.png
image.png

  • 带退出的循环是单入单出的结构化控制结构,也是一种首选的循环控制.

    什么时候使用for循环

    image.png

    什么时候使用forEach循环

    image.png

    循环控制

    循环体容易出现的问题

    image.png

  • 忽略或错误的循环执行初始化;

  • 忽略或错误的循环执行初始化;
  • 不正确的嵌套,不正确的循环终止,忽略或者错误的增加了循环变量的值,以及不正确的使用循环下标来访问数组元素等

    优化

  • 减少能影响该循环各种因素的数量

  • 把循环内部当做一个子程序来看待,放在循环体外面
  • 把循环执行的条件表达清楚

    进入循环

  • 只从一个位置进入循环;

  • 把初始化代码紧放在循环的前面
  • 用while(true)表示无限循环
  • 在适当的情况下多使用for循环
  • 在while循环适用的时候尽量不使用for循环

处理好循环体

  • 用”{“和”}”把循环中的语句括起来
  • 避免空循环
  • 一个循环只做一件事情
  • 把循环内务要么放在循环的开始,要么放在循环的结尾

image.png

退出循环

  • 设法确认循环能够终止
  • 使循环终止条件看起来能够明显
  • 不要为了终止循环随意改动循环的下标
  • 避免出现依赖于循环下标最终取值的代码
  • 考虑使用安全计数
  • 提前退出循环
  • 考虑在while循环中使用break退出循环而不是使用布尔标记
  • 小心那些有很多break散步其中的循环
  • 在循环开始处使用continue进行判断
  • 使用break和continue时要小心谨慎

    使用循环变量

  • 用整数或者枚举类型表示数组和循环的边界

  • 在嵌套循环中使用有意义的变量名来提高其可读性
  • 把循环下标的作用域尽量控制在本次循环内

    循环应该有多长

  • 循环要尽可能的短,以便能够一目了然

  • 把嵌套限制在3层以内
  • 把长循环的内容移到子程序内
  • 要让循环格外清晰

    轻松创建循环—由内而外

    image.png
    image.png
    image.png
    image.png
    image.png
    image.png

    核对表

    image.png
    image.png

    要点

    image.png

    本章思维导图

    image.png

    扩展:JavaScript中循环对比

    1,普通for循环,经常用的数组遍历

var arr = [1,2,0,3,9];
for ( var i = 0; i console.log(arr[i]);
}

2,优化版for循环:使用变量,将长度缓存起来,避免重复获取长度,数组很大时优化效果明显

for(var j = 0,len = arr.length; j < len; j++){
console.log(arr[j]);
}

3,forEach,ES5推出的,数组自带的循环,主要功能是遍历数组,实际性能比for还弱

arr.forEach(function(value,i){
 console.log(‘forEach遍历:’+i+’—‘+value);

})
forEach这种方法也有一个小缺陷:你不能使用break语句中断循环,也不能使用return语句返回到外层函数。

4,map遍历,map即是 “映射”的意思 用法与 forEach 相似

arr.map(function(value,index){
console.log(‘map遍历:’+index+’—‘+value);
});
map遍历支持使用return语句,支持return返回值
var temp=arr.map(function(val,index){
console.log(val);
return val*val
})
console.log(temp);
forEach、map都是ECMA5新增数组的方法,所以ie9以下的浏览器还不支持

5,for-of遍历 是ES6新增功能

for( let i of arr){
console.log(i);
}
for-of这个方法避开了for-in循环的所有缺陷
与forEach()不同的是,它可以正确响应break、continue和return语句
for-of循环不仅支持数组,还支持大多数类数组对象,例如DOM NodeList对象。
for-of循环也支持字符串遍历

6, for-in是为遍历对象而设计的,不适用于遍历数组。

遍历数组的缺点:数组的下标index值是数字,for-in遍历的index值”0”,”1”,”2”等是字符串

for (var index in arr){
console.log(arr[index]);
console.log(index);
}