本人学习视频为黑马程序员,视频连接为:黑马程序员
流程控制-循环
循环目的
在实际问题中,有许多具有规律性的重复操作,因此在程序中要完成这类操作就需要重复执行某些语句
JS循环类别
在Js 中,主要有三种类型的循环语句:
1 for 循环
2 while 循环
3 do…while 循环
for循环
在程序中,一组被重复执行的语句被称之为循环体,能否继续重复执行,取决于循环的终止条件。由循环体及循环的终止条件组成的语句,被称之为循环语句
语法结构
for(初始化变量; 条件表达式; 操作表达式 ){
//循环体
}
初始化变量:通常被用于初始化一个计数器,该表达式可以使用 var 关键字声明新的变量,这个变量帮我们来记录次数。
条件表达式:用于确定每一次循环是否能被执行。如果结果是 true 就继续循环,否则退出循环。
操作表达式:每次循环的最后都要执行的表达式。通常被用于更新或者递增计数器变量。当然,递减变量也是可以的。
执行过程
- 初始化变量,初始化操作在整个 for 循环只会执行一次。
- 执行条件表达式,如果为true,则执行循环体语句,否则退出循环,循环结束。
- 执行操作表达式,此时第一轮结束。
- 第二轮开始,直接去执行条件表达式(不再初始化变量),如果为 true ,则去执行循环体语句,否则退出循环。
- 继续执行操作表达式,第二轮结束。
- 后续跟第二轮一致,直至条件表达式为假,结束整个 for 循环
断点调试
断点调试是指自己在程序的某一行设置一个断点,调试时,程序运行到这一行就会停住,然后你可以一步一步往下调试,调试过程中可以看各个变量当前的值,出错的话,调试到出错的代码行即显示错误,停下。
步骤:
浏览器中按 F12–> sources -->找到需要调试的文件–>在程序的某一行设置断点
Watch: 监视,通过watch可以监视变量的值的变化,非常的常用。
F11: 程序单步执行,让程序一行一行的执行,这个时候,观察watch中变量的值的变化
案例
要求用户输入班级人数,之后依次输入每个学生的成绩,最后打印出该班级总的成绩以及平均成绩。
双重for循环
循环嵌套是指在一个循环语句中再定义一个循环语句的语法结构,例如在for循环语句中,可以再嵌套一个for 循环,这样的 for 循环语句我们称之为双重for循环。
双重 for 循环语法
for (外循环的初始; 外循环的条件; 外循环的操作表达式) {
for (内循环的初始; 内循环的条件; 内循环的操作表达式) {
需执行的代码;
}
}
内层循环可以看做外层循环的语句
内层循环执行的顺序也要遵循 for 循环的执行顺序
外层循环执行一次,内层循环要执行全部次数
打印倒三角形
打印九九乘法表
for循环小结
1.for 循环可以重复执行某些相同代码
2. for 循环可以重复执行些许不同的代码,因为我们有计数器
3. for 循环可以重复执行某些操作,比如算术运算符加法操作
4. 随着需求增加,双重for循环可以做更多、更好看的效果
5. 双重 for 循环,外层循环一次,内层 for 循环全部执行
while循环
while 语句可以在条件表达式为真的前提下,循环执行指定的一段代码,直到表达式不为真时结束循环。
语法结构
while (条件表达式) {
// 循环体代码
}
① 使用 while 循环时一定要注意,它必须要有退出条件,否则会成为死循环
② while 循环和 for 循环的不同之处在于 while 循环可以做较为复杂的条件判断,比如判断用户名和密码
执行思路
① 先执行条件表达式,如果结果为 true,则执行循环体代码;如果为 false,则退出循环,执行后面代码
② 执行循环体代码
③ 循环体代码执行完毕后,程序会继续判断执行条件表达式,如条件仍为true,则会继续执行循环体,直到循
环条件为 false 时,整个循环过程才会结束
案例
do while循环
do… while 语句其实是 while 语句的一个变体。该循环会先执行一次代码块,然后对条件表达式进行判断,如果条件为真,就会重复执行循环体,否则退出循环。
语法格式
do {
// 循环体代码 - 条件表达式为 true 时重复执行循环体代码
} while(条件表达式);
执行思路
① 先执行一次循环体代码
② 再执行条件表达式,如果结果为 true,则继续执行循环体代码,如果为 false,则退出循环,继续执行后面代码
注意:先再执行循环体,再判断,我们会发现 do…while 循环语句至少会执行一次循环体代码
循环总结
JS 中循环有 for 、while 、 do while
三个循环很多情况下都可以相互替代使用
如果是用来计次数,跟数字相关的,三者使用基本相同,但是我们更喜欢用 for
while 和 do…while 可以做更复杂的判断条件,比 for 循环灵活一些
while 和 do…while 执行顺序不一样,while 先判断后执行,do…while 先执行一次,再判断执行
while 和 do…while 执行次数不一样,do…while 至少会执行一次循环体, 而 while 可能一次也不执行
实际工作中,我们更常用for 循环语句,它写法更简洁直观, 所以这个要重点学
continue与break
continue
continue 关键字用于立即跳出本次循环,继续下一次循环(本次循环体中 continue 之后的代码就会少执行一次)。
break
break 关键字用于立即跳出整个循环(循环结束)。
数组
数组的概念
数组是指一组数据的集合,其中的每个数据被称作元素,在数组中可以存放任意类型的元素。数组是一种将一组数据存储在单个变量名下的优雅方式。
// 普通变量一次只能存放一个值
var num =10
// 数组一次可以存储多个值
var arr = [1,2,3,4]
数组的创建方式
js中创建数组有两种方式
- 利用new创建数组
- 利用数组字面量来创建数组
数组中可以存放任意类型的数据,例如字符串,数字,布尔值等.
数组索引
索引(下标):用来访问数组元素的序号(数组下标从0开始)
数组可以通过索引来访问,设置,修改对应的数组元素,我们可以通过“数组名[索引]"的形式来获取数组中的元素
遍历数组
遍历:就是把数组中的每个元素从头到尾都访问一次。
数组长度
使用“数组名.length"可以访问数组元素的数量(数组长度)
求最大值
新增数组元素
筛选数组
翻转数组
冒泡排序
推荐这里看pink老师视频,里面讲的很详细
函数
函数:就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用。
声明函数
// 声明函数
function 函数名() {
//函数体代码
}
function 是声明函数的关键字,必须小写
函数的使用
函数在使用时分为两步:声明函数和调用函数。
** 调用函数
函数名(); 通过调用函数名来执行函数体代码**
注意:声明函数本身并不会执行代码,只有调用函数时才会执行函数体代码。
函数的封装
函数的封装是把一个或者多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口
形参和实参
在声明函数时,可以在函数名称后面的小括号中添加一些参数,这些参数被称为形参,而在调用该函数时,同样也需要传递相应的参数,这些参数被称为实参。
参数的作用 : 在函数内部某些值不能固定,我们可以通过参数在调用函数时传递不同的值进去。
带参数的函数声明
function 函数名(形参1, 形参2 , 形参3…) { // 可以定义任意多的参数,用逗号分隔
// 函数体
}
带参数的函数调用
函数名(实参1, 实参2, 实参3…);
1. 调用的时候实参值是传递给形参的
2. 形参简单理解为:不用声明的变量
3. 实参和形参的多个参数之间用逗号(,)分隔
函数形参和实参个数不匹配问题
注意:在JavaScript中,形参的默认值是undefined。
小结
- 函数可以带参数也可以不带参数
- 声明函数的时候,函数名括号里面的是形参,形参的默认值为 undefined
- 调用函数的时候,函数名括号里面的是实参
- 多个参数中间用逗号分隔
- 形参的个数可以和实参个数不匹配,但是结果不可预计,我们尽量要匹配
函数的返回值
return语句
有的时候,我们会希望函数将值返回给调用者,此时通过使用 return 语句就可以实现
语法声明
声明函数
function 函数名(){
…
return 需要返回的值;
}
调用函数
函数名(); // 此时调用函数就可以得到函数体内return 后面的值
在使用 return 语句时,函数会停止执行,并返回指定的值
如果函数没有 return ,返回的值是 undefine
return终止函数
return 语句之后的代码不被执行。
函数都是有返回值的
- 如果有return 则返回 return 后面的值
- 如果没有return 则返回 undefined
break ,continue ,return 的区别
break :结束当前的循环体(如 for、while)
continue :跳出本次循环,继续执行下次循环(如 for、while)
return :不仅可以退出循环,还能够返回 return 语句中的值,同时还可以结束当前的函数体内的代码
argument的使用
当我们不确定有多少个参数传递的时候,可以用 arguments 来获取。在 JavaScript 中,arguments 实际上它是当前函数的一个内置对象。所有函数都内置了一个 arguments 对象,arguments 对象中存储了传递的所有实参。
伪数组特点
- 具有 length 属性
- 按索引方式储存数据
- 不具有数组的 push , pop 等方法
案例
函数间相互调用
因为每个函数都是独立的代码块,用于完成特殊任务,因此经常会用到函数相互调用的情况。
函数的两种声明方式
自定义函数方式(命名函数)
利用函数关键字 function 自定义函数方式
// 声明定义方式
function fn() {…}
// 调用
fn();
因为有名字,所以也被称为命名函数
调用函数的代码既可以放到声明函数的前面,也可以放在声明函数的后面
函数表达式方式(匿名函数)
这是函数表达式写法,匿名函数后面跟分号结束
var fn = function(){…};
调用的方式,函数调用必须写到函数体下面
fn();
因为函数没有名字,所以也被称为匿名函数
这个fn 里面存储的是一个函数
函数表达式方式原理跟声明变量方式是一致的
函数调用的代码必须写到函数体后面
作用域
JavaScript作用域 : 就是代码名字(变量)在某个范围内起作用和效果 目的是为了提高程序的可靠性更重要的是减少命名冲突
全局作用域
整个script标签 或者是一个单独的js文件
局部作用域
** 在函数内部就是局部作用域 这个代码的名字只在函数内部起效果和作用**
变量作用域
全局变量
在全局作用域下的变量 在全局下都可以使用
注意 如果在函数内部 没有声明直接赋值的变量也属于全局变量
局部变量
在局部作用域下的变量 后者在函数内部的变量就是 局部变量
注意: 函数的形参也可以看做是局部变量
全局变量和局部变量的区别
全局变量:在任何一个地方都可以使用,只有在浏览器关闭才会被销毁,因此比较占内存
局部变量:只有在函数内部使用,当其所在的代码块被执行时,会被初始化,当代码块运行结束后,就会被销毁,因此更节省内存
块级作用域
在目前的javascript中是没有块级作用域的,需要到后续的ES6中才会出现块级作用域,块级作用域是用 {} 包裹,如 if {} for {}里面声明的变量是不能在{}外调用的。
作用域链
内部函数访问外部函数的变量,采取的是链式查找的方式来决定取那个值
案例
a为4,b为22
解析:因为在fn3中有a=4,所以输出时离fn3最近的是它本身,直接输出fn3。b在fn3中没有,往上一级fn2中寻找没有b,再往上一级fn1找找到b=22,于是便输出22