前端之JS运算符、流程控制、循环、代码规范、数组及函数

1、运算符(操作符)

1.1、运算符的分类

运算符(operator)也被称为操作符,是用于实现赋值、比较和执行算数运算等功能的符号

JavaScript中常用的运算符有:

  • 算数运算符
  • 递增和递减运算符
  • 比较运算符
  • 逻辑运算符
  • 赋值运算符
1.2、算数运算符
  • 算术运算符概述
    概念:算术运算使用的符号,用于执行两个变量或值的算术运算
    在这里插入图片描述
  • 浮点数的精度问题
    浮点数值的最高精度是 17 位小数,但在进行算术计算时其精确度远远不如整数
var result = 0.1 + 0.2;    // 结果不是 0.3,而是:0.30000000000000004
console.log(0.07 * 100);   // 结果不是 7,  而是:7.000000000000001

所以:不要直接判断两个浮点数是否相等 !

  • 表达式和返回值
    表达式:是由数字、运算符、变量等以能求得数值的有意义排列方法所得的组合
    简单理解:是由数字、运算符、变量等组成的式子
    表达式最终都会有一个结果,返回给开发者,称为返回值
1.3、递增和递减运算符
  • 递增和递减运算符概述
    如果需要反复给数字变量添加或减去1,可以使用递增(++)和递减( – )运算符来完成
    在 JavaScript 中,递增(++)和递减( – )既可以放在变量前面,也可以放在变量后面。放在变量前面时,我们可以称为前置递增(递减)运算符,放在变量后面时,我们可以称为后置递增(递减)运算符。
    注意:递增和递减运算符必须和变量配合使用。

  • 递增运算符

    • 前置递增运算符
      ++num 前置递增,就是自加1,类似于 num = num + 1,但是 ++num 写起来更简单。
      使用口诀:先自加,后返回值
      var  num = 10;
      alert(++num + 10);   // 21
      
    • 后置递增运算符
      num++ 后置递增,就是自加1,类似于 num = num + 1 ,但是 num++ 写起来更简单
      使用口诀:先返回原值,后自加
      var  num = 10;
      alert(10 + num++);  // 20
      
1.4、比较运算符
  • 比较运算符概述
    概念:比较运算符(关系运算符)是两个数据进行比较时所使用的运算符,比较运算后,会返回一个布尔值(true / false)作为比较运算的结果
    在这里插入图片描述
    等号比较
    在这里插入图片描述
console.log(18 == '18');
console.log(18 === '18'); 
1.5、逻辑运算符
  • 逻辑运算符概述
    概念:逻辑运算符是用来进行布尔值运算的运算符,其返回值也是布尔值,后面开发中经常用于多个条件的判断
    在这里插入图片描述
  • 逻辑与&&
    两边都是 true才返回 true,否则返回 false
    在这里插入图片描述
    在这里插入图片描述
  • 逻辑或 ||
    两边都是 true才返回 true,否则返回 false
    在这里插入图片描述
    在这里插入图片描述
  • 逻辑非 !
    逻辑非(!)也叫作取反符,用来取一个布尔值相反的值,如 true 的相反值是 false
    var isOk = !true;
    console.log(isOk);  // false
    
  • 短路运算(逻辑中断)
    短路运算的原理:当有多个表达式(值)时,左边的表达式值可以确定结果时,就不再继续运算右边的表达式的值
    • 逻辑与
      语法: 表达式1 && 表达式2
      - 如果第一个表达式的值为真,则返回表达式2
      
      - 如果第一个表达式的值为假,则返回表达式1
      
      console.log( 123 && 456 );        // 456
      console.log( 0 && 456 );          // 0
      console.log( 123 && 456&& 789 );  // 789
      
    • 逻辑或
      语法: 表达式1 || 表达式2
      - 如果第一个表达式的值为真,则返回表达式1
      
      - 如果第一个表达式的值为假,则返回表达式2
      
      console.log( 123 || 456 );         //  123
      console.log( 0 ||  456 );          //  456
      console.log( 123 || 456 || 789 );  //  123
      
1.6、赋值运算符

概念:用来把数据赋值给变量的运算符
在这里插入图片描述

var age = 10;
age += 5;  // 相当于 age = age + 5;
age -= 5;  // 相当于 age = age - 5;
age *= 10; // 相当于 age = age * 10;
1.7、运算符优先级

在这里插入图片描述

  • 一元运算符里面的逻辑非优先级很高
  • 逻辑与比逻辑或优先级高

2、流程控制

2.1、流程控制概念
在一个程序执行的过程中,各条代码的执行顺序对程序的结果是有直接影响的,很多时候我们要通过控制代码的执行顺序来实现我们要完成的功能

简单理解: **流程控制就是来控制代码按照一定结构顺序来执行**

流程控制主要有三种结构,分别是**顺序结构****分支结构****循环结构**,代表三种代码执行的顺序

在这里插入图片描述

2.2、顺序流程控制

顺序结构是程序中最简单、最基本的流程控制,它没有特定的语法结构,程序会按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的
在这里插入图片描述

2.3、分支流程控制
  • 分支结构
    由上到下执行代码的过程中,根据不同的条件,执行不同的路径代码(执行代码多选一的过程),从而得到不同的结果
    在这里插入图片描述
    JS 语言提供了两种分支结构语句:if 语句、switch 语句
  • if 语句
    • 语法结构
      // 条件成立执行代码,否则什么也不做
      if (条件表达式) {
          // 条件成立执行的代码语句
      }
      
      语句可以理解为一个行为,循环语句和分支语句就是典型的语句。一个程序由很多个语句组成,一般情况下,会分割成一个一个的语句
      
    • 执行流程
      在这里插入图片描述
  • if else语句(双分支语句)
    • 语法结构
      // 条件成立  执行 if 里面代码,否则执行else 里面的代码
      if (条件表达式) {
          // [如果] 条件成立执行的代码
      } else {
          // [否则] 执行的代码
      }
      
    • 执行流程
      在这里插入图片描述
  • if else if 语句(多分支语句)
    • 语法结构
      // 适合于检查多重条件。
      if (条件表达式1) {
          语句1} else if (条件表达式2)  {
          语句2} else if (条件表达式3)  {
         语句3....
      } else {
          // 上述条件都不成立执行此处代码
      }
      
    • 执行逻辑
      在这里插入图片描述
2.4、三元表达式
  • 语法结构
    表达式1 ? 表达式2 : 表达式3;
    
  • 执行思路
    • 如果表达式1为 true ,则返回表达式2的值,如果表达式1为 false,则返回表达式3的值
    • 简单理解: 就类似于 if else (双分支) 的简写
2.5、switch分支流程控制
  • 语法结构
    switch 语句也是多分支语句,它用于基于不同的条件来执行不同的代码,当要针对变量设置一系列的特定值的选项时,就可以使用 switch
    switch( 表达式 ){ 
        case value1:
            // 表达式 等于 value1 时要执行的代码
            break;
        case value2:
            // 表达式 等于 value2 时要执行的代码
            break;
        default:
            // 表达式 不等于任何一个 value 时要执行的代码
    }
    
    • switch :开关 转换 , case :小例子 选项
    • 关键字 switch 后面括号内可以是表达式或值, 通常是一个变量
    • 关键字 case , 后跟一个选项的表达式或值,后面跟一个冒号
    • switch 表达式的值会与结构中的 case 的值做比较
    • 如果存在匹配全等(===) ,则与该 case 关联的代码块会被执行,并在遇到 break 时停止,整个 switch 语句代码执行结束
    • 如果所有的 case 的值都和表达式的值不匹配,则执行 default 里的代码
      注意: 执行case 里面的语句时,如果没有break,则继续执行下一个case里面的语句
  • switch 语句和 if else if 语句的区别
    • 一般情况下,它们两个语句可以相互替换
    • switch…case 语句通常处理 case为比较确定值的情况, 而 if…else…语句更加灵活,常用于范围判断(大于、等于某个范围)
    • switch 语句进行条件判断后直接执行到程序的条件语句,效率更高。而if…else 语句有几种条件,就得判断多少次
    • 当分支比较少时,if… else语句的执行效率比 switch语句高
    • 当分支比较多时,switch语句的执行效率比较高,而且结构更清晰

3、循环

3.1、for循环
  • 语法结构
for(初始化变量; 条件表达式; 操作表达式 ){
    //循环体
}
名称作用
初始化变量通常被用于初始化一个计数器,该表达式可以使用 var 关键字声明新的变量,这个变量帮我们来记录次数
条件表达式用于确定每一次循环是否能被执行。如果结果是 true 就继续循环,否则退出循环
操作表达式用于确定每一次循环是否能被执行。如果结果是 true 就继续循环,否则退出循环

执行过程:
1、初始化变量,初始化操作在整个 for 循环只会执行一次

  • 执行条件表达式,如果为true,则执行循环体语句,否则退出循环,循环结束
    1、执行操作表达式,此时第一轮结束
    2、第二轮开始,直接去执行条件表达式(不再初始化变量),如果为 true ,则去执行循环体语句,否则退出循环
    3、继续执行操作表达式,第二轮结束
    4、后续跟第二轮一致,直至条件表达式为假,结束整个 for 循环
    断点调试:
断点调试是指自己在程序的某一行设置一个断点,调试时,程序运行到这一行就会停住,然后你可以一步一步往下调试,调试过程中可以看各个变量当前的值,出错的话,调试到出错的代码行即显示错误,停下。断点调试可以帮助观察程序的运行过程
断点调试的流程:
1、浏览器中按 F12--> sources -->找到需要调试的文件-->在程序的某一行设置断点
2、Watch: 监视,通过watch可以监视变量的值的变化,非常的常用。
3、摁下F11,程序单步执行,让程序一行一行的执行,这个时候,观察watch中变量的值的变化
  • for 循环重复相同的代码
    比如输出10句“hello world”
//  基本写法
for(var i = 1; i <= 10; i++){
    console.log('hello world');
}
// 用户输入次数
var num = prompt('请输入次数:')for ( var i = 1 ; i <= num; i++) {
    console.log('hello world');
} 
  • for 循环重复不相同的代码
    例如,求输出1到100岁
//  基本写法
for (var i = 1; i <= 100; i++) {
      console.log('这个人今年' + i + '岁了');
}

例如,求输出1到100岁,并提示出生、死亡

// for 里面是可以添加其他语句的 
for (var i = 1; i <= 100; i++) {
 if (i == 1) {
    console.log('这个人今年1岁了, 它出生了');
 } else if (i == 100) {
    console.log('这个人今年100岁了,它死了');
  } else {
       console.log('这个人今年' + i + '岁了');
  }
}

for循环因为有了计数器的存在,还可以重复的执行某些操作,比如做一些算术运算

3.2、双重for循环
  • 双重 for 循环概述
循环嵌套是指在一个循环语句中再定义一个循环语句的语法结构,例如在for循环语句中,可以再嵌套一个for 循环,这样的 for 循环语句我们称之为双重for循环
  • 双重 for 循环语法

    for (外循环的初始; 外循环的条件; 外循环的操作表达式) {
        for (内循环的初始; 内循环的条件; 内循环的操作表达式) {  
           需执行的代码;
       }
    }
    
    • 内层循环可以看做外层循环的循环体语句
    • 内层循环执行的顺序也要遵循 for 循环的执行顺序
    • 外层循环执行一次,内层循环要执行全部次数
  • 打印五行五列星星

var star = '';
for (var j = 1; j <= 3; j++) {
    for (var i = 1; i <= 3; i++) {
      star += '☆'
    }
    // 每次满 5个星星 就 加一次换行
    star += '\n'
}
console.log(star);

核心逻辑:
1、内层循环负责一行打印五个星星
2、外层循环负责打印五行

  • for 循环小结
    • for 循环可以重复执行某些相同代码
    • for 循环可以重复执行些许不同的代码,因为我们有计数器
    • for 循环可以重复执行某些操作,比如算术运算符加法操作
    • 随着需求增加,双重for循环可以做更多、更好看的效果
    • 双重 for 循环,外层循环一次,内层 for 循环全部执行
    • for 循环是循环条件和数字直接相关的循环
3.3、while循环

while语句的语法结构如下:

while (条件表达式) {
    // 循环体代码 
}

执行思路:

  • 1、先执行条件表达式,如果结果为 true,则执行循环体代码;如果为 false,则退出循环,执行后面代码
  • 2、执行循环体代码
  • 3、循环体代码执行完毕后,程序会继续判断执行条件表达式,如条件仍为true,则会继续执行循环体,直到循环条件为 false 时,整个循环过程才会结束

注意:

  • 使用 while 循环时一定要注意,它必须要有退出条件,否则会成为死循环
3.4、do-while循环

do… while 语句的语法结构如下:

do {
    // 循环体代码 - 条件表达式为 true 时重复执行循环体代码
} while(条件表达式);

执行思路

  • 1 先执行一次循环体代码
  • 2 再执行条件表达式,如果结果为 true,则继续执行循环体代码,如果为 false,则退出循环,继续执行后面代码
    注意:先再执行循环体,再判断,do…while循环语句至少会执行一次循环体代码
3.5、continue、break

continue 关键字用于立即跳出本次循环,继续下一次循环(本次循环体中 continue 之后的代码就会少执行一次)

例如,吃5个包子,第3个有虫子,就扔掉第3个,继续吃第4个第5个包子,其代码实现如下:

for (var i = 1; i <= 5; i++) {
     if (i == 3) {
         console.log('这个包子有虫子,扔掉');
         continue; // 跳出本次循环,跳出的是第3次循环 
      }
      console.log('我正在吃第' + i + '个包子呢');
 }

运行结果:
在这里插入图片描述
break 关键字用于立即跳出整个循环(循环结束)

例如,吃5个包子,吃到第3个发现里面有半个虫子,其余的不吃了,其代码实现如下:

for (var i = 1; i <= 5; i++) {
  if (i == 3) {
      break; // 直接退出整个for 循环,跳到整个for下面的语句
  }
  console.log('我正在吃第' + i + '个包子呢');
}

运行结果:
在这里插入图片描述

4、代码规范

4.1、标识符命名规范
  • 变量、函数的命名必须要有意义
  • 变量的名称一般用名词
  • 函数的名称一般用动词
4.2、操作符规范
// 操作符的左右两侧各保留一个空格
for (var i = 1; i <= 5; i++) {
   if (i == 3) {
       break; // 直接退出整个 for 循环,跳到整个for循环下面的语句
   }
   console.log('我正在吃第' + i + '个包子呢');
}
4.3、单行注释规范
for (var i = 1; i <= 5; i++) {
   if (i == 3) {
       break; // 单行注释前面注意有个空格
   }
   console.log('我正在吃第' + i + '个包子呢');
}
4.4、其他规范
关键词、操作符之间后加空格

在这里插入图片描述

5、数组

5.1、数组的概念
  • 数组可以把一组相关的数据一起存放,并提供方便的访问(获取)方式
  • 数组是指一组数据的集合,其中的每个数据被称作元素,在数组中可以存放任意类型的元素,数组是一种将一组数据存储在单个变量名下的优雅方式
5.2、创建数组

JS 中创建数组有两种方式:

  • 利用 new 创建数组
var 数组名 = new Array()var arr = new Array();   // 创建一个新的空数组
  • 利用数组字面量创建数组
    // 1. 使用数组字面量方式创建空的数组
    var  数组名 = []// 2. 使用数组字面量方式创建带初始值的数组
    var  数组名 = ['小白','小黑','大黄','瑞奇'];
    
    • 数组的字面量是方括号 [ ]
    • 声明数组并赋值称为数组的初始化
    • 这种字面量方式也是我们以后最多使用的方式
  • 数组元素的类型
    数组中可以存放任意类型的数据,例如字符串,数字,布尔值等
var arrStus = ['小白',12,true,28.9];
5.3、获取数组中的元素

索引 (下标) :用来访问数组元素的序号(数组下标从 0 开始)
在这里插入图片描述
数组可以通过索引来访问、设置、修改对应的数组元素,可以通过“数组名[索引]”的形式来获取数组中的元素

// 定义数组
var arrStus = [1,2,3];
// 获取数组中的第2个元素
alert(arrStus[1]); 

注意:如果访问时数组没有和索引值对应的元素,则得到的值是undefined

5.4、遍历数组
  • 数组遍历
    把数组中的每个元素从头到尾都访问一次(类似学生的点名),可以通过 for 循环索引遍历数组中的每一项
var arr = ['red','green', 'blue'];
for(var i = 0; i < arr.length; i++){
    console.log(arrStus[i]);
}
  • 数组的长度
    数组的长度:默认情况下表示数组中元素的个数
    使用“数组名.length”可以访问数组元素的数量(数组长度)
    var arrStus = [1,2,3];
    alert(arrStus.length);  // 3
    
    注意:
    • 此处数组的长度是数组元素的个数 ,不要和数组的索引号混淆
  • 当我们数组里面的元素个数发生了变化,这个 length 属性跟着一起变化
    • 数组的length属性可以被修改
  • 如果设置的length属性值大于数组的元素个数,则会在数组末尾出现空白元素
    • 如果设置的length属性值小于数组的元素个数,则会把超过该值的数组元素删除
5.5、数组中新增元素

数组中可以通过以下方式在数组的末尾插入新元素:

数组[ 数组.length ] = 新数据;

6、函数

6.1、函数的概念

在 JS 里面,可能会定义非常多的相同代码或者功能相似的代码,这些代码可能需要大量重复使用。虽然 for循环语句也能实现一些简单的重复操作,但是比较具有局限性,此时我们就可以使用 JS 中的函数

函数:就是封装了一段可被重复调用执行的代码块,通过此代码块可以实现大量代码的重复使用

6.2、函数的使用
6.2.1、声明函数
// 声明函数
function 函数名() {
    //函数体代码
}
  • function 是声明函数的关键字,必须小写
  • 由于函数一般是为了实现某个功能才定义的, 所以通常我们将函数名命名为动词,比如 getSum
6.2.2、调用函数
// 调用函数
函数名();  // 通过调用函数名来执行函数体代码
  • 调用的时候千万不要忘记添加小括号
  • 口诀:函数不调用,自己不执行
    注意:声明函数本身并不会执行代码,只有调用函数时才会执行函数体代码
6.2.3、函数的封装
  • 函数的封装是把一个或者多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口
  • 简单理解:封装类似于将电脑配件整合组装到机箱中 ( 类似快递打包)
    在这里插入图片描述
    例子:封装计算1-100累加和
/* 
   计算1-100之间值的函数
*/
// 声明函数
function getSum(){
  var sumNum = 0;// 准备一个变量,保存数字和
  for (var i = 1; i <= 100; i++) {
    sumNum += i;// 把每个数值 都累加 到变量中
  }
  alert(sumNum);
}
// 调用函数
getSum();
6.3、函数的参数
6.3.1、函数参数语法
  • 形参:函数定义时设置接收调用时传入
  • 实参:函数调用时传入小括号内的真实数据
    在这里插入图片描述
    参数的作用 : 在函数内部某些值不能固定,我们可以通过参数在调用函数时传递不同的值进去

函数参数的运用:

// 带参数的函数声明
function 函数名(形参1, 形参2 , 形参3...) { // 可以定义任意多的参数,用逗号分隔
  // 函数体
}
// 带参数的函数调用
函数名(实参1, 实参2, 实参3...); 

1、调用的时候实参值是传递给形参的
2、形参简单理解为:不用声明的变量
3、实参和形参的多个参数之间用逗号(,)分隔

6.3.2、函数形参和实参数量不匹配时

在这里插入图片描述

注意: 在JavaScript中,形参的默认值是undefined

小结:

  • 函数可以带参数也可以不带参数
  • 声明函数的时候,函数名括号里面的是形参,形参的默认值为 undefined
  • 调用函数的时候,函数名括号里面的是实参
  • 多个参数中间用逗号分隔
  • 形参的个数可以和实参个数不匹配,但是结果不可预计,我们尽量要匹配
6.4、函数的返回值

return 语句

返回值:函数调用整体代表的数据;函数执行完成后可以通过return语句将指定数据返回
// 声明函数
function 函数名(){
    ...
    return  需要返回的值;
}
// 调用函数
函数名();    // 此时调用函数就可以得到函数体内return 后面的值
  • 在使用 return 语句时,函数会停止执行,并返回指定的值
  • 如果函数没有 return ,返回的值是 undefined

break ,continue ,return 的区别

  • break :结束当前的循环体(如 for、while)
  • continue :跳出本次循环,继续执行下次循环(如 for、while)
  • return :不仅可以退出循环,还能够返回 return 语句中的值,同时还可以结束当前的函数体内的代码
6.5、arguments的使用

当不确定有多少个参数传递的时候,可以用 arguments 来获取。JavaScript 中,arguments实际上它是当前函数的一个内置对象。所有函数都内置了一个 arguments 对象,arguments 对象中存储了传递的所有实参。arguments展示形式是一个伪数组,因此可以进行遍历,伪数组具有以下特点:

  • 具有 length 属性
  • 按索引方式储存数据
  • 不具有数组的 push , pop 等方法
    注意:在函数内部使用该对象,用此对象获取函数调用时传的实参
6.6、函数案例

函数内部可以调用另一个函数,在同一作用域代码中,函数名即代表封装的操作,使用函数名加括号即可以将封装的操作执行

6.7、函数的两种声明方式
  • 自定义函数方式(命名函数)
    利用函数关键字 function 自定义函数方式
    // 声明定义方式
    function fn() {...}
    // 调用  
    fn();  
    
    • 因为有名字,所以也被称为命名函数
    • 调用函数的代码既可以放到声明函数的前面,也可以放在声明函数的后面
  • 函数表达式方式(匿名函数)
    利用函数表达式方式的写法如下:
    // 这是函数表达式写法,匿名函数后面跟分号结束
    var fn = function(){...}// 调用的方式,函数调用必须写到函数体下面
    fn();
    
    • 因为函数没有名字,所以也被称为匿名函数
    • 这个fn 里面存储的是一个函数
    • 函数表达式方式原理跟声明变量方式是一致的
    • 函数调用的代码必须写到函数体后面
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
了解三目运算符流程控制数组的知识,并且练习使用Scanner获取用户数据,if、switch选择结构和for、while循环控制代码流程,以及遍历数组的方法是制作一个简单的图书管理系统所需的基本技能。以下是可能出现的问题及其解决办法: 1. 用户输入错误数据:当使用Scanner获取用户输入数据时,用户可能会输入错误的数据类型或者无效的数据。解决办法是使用异常处理机制来捕获并处理这些错误,例如使用try-catch语句。 2. 条件判断错误:在使用if或switch选择结构时,可能会出现条件判断错误导致逻辑错误。解决办法是仔细检查条件表达式,确保它们能正确判断条件。 3. 循环控制问题:在使用for或while循环时,可能会出现循环控制条件错误或循环体内部逻辑错误。解决办法是仔细检查循环控制条件和循环体内部的逻辑,确保它们符合预期。 4. 数组越界错误:在操作数组时,可能会出现数组越界错误,即访问到了数组范围之外的索引。解决办法是确保访问数组时索引值在合法范围内,并进行必要的边界检查。 5. 遍历数组问题:在遍历数组时,可能会出现遗漏或重复遍历的问题。解决办法是仔细设计遍历逻辑,并使用合适的循环控制条件和索引变量。 6. 功能缺失或不完善:在实现图书管理系统时,可能会遗漏某些功能或功能实现不完善。解决办法是仔细分析需求,确保每个功能都得到正确实现,并进行测试和优化。 7. 代码复用问题:在编写代码时,可能会出现重复的代码段,导致代码冗余。解决办法是使用方法或函数来封装可复用的代码,提高代码的可维护性。 8. 性能问题:在系统测试过程中,可能会发现系统响应速度较慢或存在性能瓶颈。解决办法是对代码进行优化,如减少循环次数、合理使用缓存等。 通过对这些问题的预防和解决,可以保证图书管理系统的正确运行和良好的用户体验。同时,通过不断的练习和学习,可以提高解决问题的能力和技术水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值