概述:根据对应的条件来控制对应的代码片段的执行次数(多次执行 循环执行)
常用的循环控制语句:
- while循环
- do while循环
- for循环
- ...
循环是重复执行多次代码所以对应的执行次数是可以计算的
时间复杂度:用于评估执行程序所消耗的时间,区分效率,可以估算出程序对处理器的使用程度
循环的三要素
- 初始值 初始的变量值
- 迭代值 基于初始值的变化
- 判断条件 对应的执行循环中代码的变化
while循环
var 变量 = 初始值
while (终止条件(当他为false的时候就会结束对应的循环)) {
执行的代码(循环体)
迭代
}
var sum = 0
var i = 0
while (i<100) {
i++
sum+=i
}
console.log(sum)
- var关键词修饰的变量进行变量提升 伪全局变量
- var关键词修饰的变量会被预编译 但是不会读取赋值操作 而是强制赋值undefined
- 在循环中不建议声明变量 会覆盖之前的值 会加大空间复杂度
do while
var 变量 = 初始值
do {
迭代量
循环体
} while (条件);
先执行后判断,至少执行一次
var i = 0
var sum = 0
do {
i++
if (i%2) {
sum+=i
}
} while (i<100);
console.log(sum)
do while和while以及使用场景
- do while是先执行后判断,最少执行一次 (常用于人机交互)
- while是先判断后执行 最少执行0次 (对应的循环处理)
for
for循环跟while之间可以互相转换也就说他们对应的运行过程是一样的
任何循环之间可以互相转换 while循环适用于你不知道执行次数的时候 for循环适用于知道执行次数
for(初始值;条件判断;迭代值){
循环体
}
for(var i = 1 ; i<=100 ; i++){
console.log(i)
}
console.log(i)
for(;;){
//死循环
}
循环嵌套
所有的循环都可以进行嵌套 不同循环之间可以相互嵌套
- 循环嵌套时间复杂度会增加(不建议嵌套超过俩层)
- 循环嵌套执行的次数为外层循环次数*内层循环次数
for(初始值;条件;迭代量){
for(初始值;条件;迭代量){
执行的代码 (执行的次数是对应的俩个循环执行次数的乘积)
}
}
var 变量 = 初始值
while(条件表达式){
执行的代码(循环体)
迭代
var 变量 = 初始值
while(条件表达式){
执行的代码(循环体)
迭代
}
}
for(初始值;条件;迭代量){
var 变量 = 初始值
while(条件表达式){
执行的代码(循环体)
迭代
}
}
嵌套在最里面的那个循环执行的次数是所有的循环的次数的乘积
break 和 continue
break是用于跳出 他可以跳出对应的switch块 以及对应的循环块 (跳出来了也就意味着本次对应的循环或对应的代码执行结束了)
contiue是用于跳过某个循环 下次循环继续执行
break示例
for(var i=1;i<5;i++){
if(i%2==0){
break; //结束了当前的循环
}
console.log(i)//1
}
continue示例
for (var i = 1; i < 5; i++) {
if (i % 2 == 0) {
continue //跳过本次循环 进入下一次
}
console.log(i) //1 3
}
循环总结
- 循环是用于反复多次执行一段代码
- 循环的三种方案可以互相嵌套 以及三种方法可以随意转换 常用的为for和while
- while循环用于处理不知道对应的执行次数 for循环常用于知道对应的执行次数
- 循环要避免对应的死循环(死循环就是循环的迭代条件一直为true 没有办法停止)
- while死循环写法 for死循环写法
- while循环的时间复杂度低于for循环 for循环的执行效率要低于while循环
- do while循环先做后判断 最少执行一次 while及for最少执行0次
时间复杂度
在恒定的环境内,他的执行次数和对应的变量的比例构成的值。也就是说在恒定机器内执行次数越多那么时间复杂度越高,那么对应的时间复杂度越高 他的执行效率就越低。将时间复杂度降低那么就可以提高对应的效率。
时间复杂度(用O来表示)跟对应的执行次数成正比
分类:
- O(1)常数阶
- O(logn)对数阶
- O(n)线性阶
- O(nlogn)线性对数阶
- O(n平方)平方阶
- O(n的立方)立方阶
时间复杂度排序
O1<Ologn<On<Onlogn<On^2<On^3<On^k....
空间复杂度
程序在运行的时候开辟的内存大小。
空间复杂度越低占用的内存就越少(内存不再优先考虑)
总结
循环嵌套不会超过两次
从对应的时间复杂度来看,logn和n是比较常用的
logn是比n要快得的,所以后续的优化中采用logn级别的时间复杂度来替代n
对于for循环和while循环,对应的时间复杂度来说while要快于for循环,用while来替代for循环