第三章 流程控制

266 阅读8分钟

流程图

流程图是一套标准的图形,用于描述程序的逻辑

圆角矩形、椭圆:表示开始或结束,一个流程图中有且仅有一个开始和结束

菱形:表示判断

平行四边形:表示输入输出

矩形:表示流程中的步骤

各个流程之间使用连接线进行关联

image.png

if判断

语法

if(条件1){
    // 代码块
} else if(条件2){
    // 代码块
} else if(条件3){
    // 代码块
}
//....
else{
    // 以上条件都不满足执行的代码块
}

注意:

  1. 如果上面的某个条件满足,则直接忽略下面部分
  2. if只能出现一次
  3. else if 可以有0个或多个
  4. else可以有0个或1个
  5. 如果代码块只有一条语句,可以省略花括号(但不推荐)

if中的var变量也存在提升

if(!x){
	x = 0;
}

if(x++ >= 1){
     var x;
     x++;
} else if(++x >= 2){
     x++;
} else {
     x--;
}

console.log(x);			// 3

switch开关

语法

switch(表达式){
    case 数据1: {
        // 代码块
    }
    case 数据2: {
        // 代码块
    }
    //...
    default: {
        // 代码块
    }
    // ...
}

注意:

  • 计算表达式的返回值,然后将其依次和case后面的数据进行严格相等比较,如果与某个相等,就停止比较,然后运行其内部的代码块,再然后,依次运行之后的所有代码块
  • 在case分支内部,可以使用break语句,它可以跳出switch结构,让之后的代码不再执行
  • 若在default执行前没有执行过break,则default中的代码块就会运行,default的位置不是只能在最后

循环

for循环

for(表达式1; 表达式2; 表达式3){
    循环体;
}

while循环

while(条件){
    循环体;
}

do while循环

do{
    循环体;
}while(条件);

与while循环的区别在于,do while循环至少会执行一次循环体

for in循环

for(var 变量 in 对象){
    循环体;
}

每次循环将对象中的一个属性名取出并赋值给变量,然后运行循环体

for in循环能够遍历到对象以及对象的原型链上的所有可枚举属性

循环中的关键字

break:跳出循环体,不运行break之后的代码

continue:停止本轮循环体,不运行continue之后的代码,然后直接进入下轮循环

数组

创建数组

  1. new Array(数据, 数据, 数据, ...)

    创建一个数组,并初始化其每一项的值

    若传入的参数只有一个整数,则会把该参数当做数组长度,而不是数组第一项元素的内容

  2. new Array(长度)

    长度必须是一个number类型的正整数(包含0)

    若长度>0,则这样创建出的是一个稀松数组

  3. [数据, 数据, 数据, ...]

    创建一个数组,并初始化其每一项的值

数组的本质

数组本质上是一个对象,对数组使用typeof关键字,得到的是"object"

是对象就允许有属性,数组的属性名大部分情况下是数字,数组中的这些数字属性名称之为元素的下标

虽然属性名是数字,但这些数字本质上是字符串,因为属性名只能为字符串

参考对象访问数字属性的方式,使用数组[下标]数组["下标"]来访问某个数组元素,而数组[下标]最终还是要转换为数组["下标"]

length属性:数组天生自带的属性,表示数组中元素的个数(会计算empty)

允许给数组添加非数字属性名的属性,因为数组就是对象

var arr = [1, 2, 3];
arr.a = 10;
console.log(arr);

image.png

数组的特质

虽然数组是一个对象,但数组也拥有只属于自己的特性

  1. 若不指定元素的属性名,则默认使用数字作为元素的属性名,数字属性名是从0开始的,且会依次递增1排列

  2. 改变数组的length,会自动截断数组或增加数组元素

    截断数组:

    var arr = [1, 2, 3, 4, 5];
    arr.length = 2;
    console.log(arr);
    

    image.png

    增加数组元素:

    var arr = [1, 2, 3];
    arr.length = 10;
    console.log(arr);
    

    image.png

  3. 改变数组最大下标,会导致数组的length发生改变

    var arr = [1, 2, 3];
    arr[10] = 11;
    console.log(arr);
    

    image.png

  4. length属性是不可枚举的,for in循环遍历不到数组的length属性

    不可枚举的属性在调试控制台中都以浅粉色进行显示

实际开发中,不要手动给数组的length赋值

稀松数组

下标不连续(即包含empty)的数组称之为稀松数组

image.png

使用下面的方式会生成稀松数组:

  1. [,,,]

    包含3个empty的稀松数组

    注意:不是4个empty

  2. new Array(3)

    包含3个empty的稀松数组

注意:

  • 使用for in循环遍历稀松数组时,会将数组的每个下标取出,然后根据取出的下标对元素进行访问,而empty不存在对应的下标,因此empty也无法被for in循环遍历到

    var arr = [1, 2, , , 5];
    console.log(arr);
    for(var index in arr){
        console.log(arr[index]);
    }
    

    image.png

  • 类似于访问对象中不存在的属性,访问数组中内容为empty或超出最大下标的数组元素时,得到的是undefined

为数组添加数据

  1. 数组[数组.length] = 数据

    向数组的末尾添加一项数据

  2. 数组.push(数据1, 数据2, ...)

    向数组的末尾添加数据

  3. 数组.unshift(数据1, 数据2, ...)

    向数组的起始位置添加数据

  4. 数组.splice(下标, 0, 数据1, 数据2, ...)

    向数组的指定下标位置处插入数据,原下标位置及其之后的数据后移

    如果传入的下标大于等于数组的长度,则在数组的末尾添加数据(等同为push)

    如果传入的下标小于等于0,则在数组的起始位置添加数据(等同为unshift)

    下标允许为负值,表示从数组的末尾向起始位置数第几个元素位置处进行插入

    splice主要用于删除数组元素,这里的0表示删除0个元素,若大于0,则splice会先删再插

删除数组元素

  1. delete 数组[下标]

    这种做法是让empty替换掉原数据,不会导致数组的length发生改变

  2. 数组.pop()

    删除数组的最后一项,并返回删除的项

  3. 数组.shift()

    删除数组的第一项,并返回删除的项

  4. 数组.splice(下标, n[, 数据1, 数据2, ...])

    从指定下标位置开始,删除n个元素【,然后在下标位置插入数据】

    该函数返回一个新数组,其中的元素为被删除的元素序列

    下标允许为负值,表示对从数组的末尾向起始位置数第几个元素位置处进行操作

其它操作

  • 获取数组片段:数组.slice([起始下标, 结束下标])

    返回一个新数组,新数组中保存着原数组从起始下标开始,到结束下标为止,但不包含结束下标的元素序列

    该方法不会改变原数组

    起始下标默认为0,结束下标默认为数组的长度

    下标允许为负值,表示倒数第几个元素

  • 查找元素:数组.indexOf(元素)

    查找并返回第一个匹配元素的下标

    若找到则返回下标,否则返回-1

    内部使用严格相等进行比较

  • 查找元素:数组.lastIndexOf(元素)

    查找并返回最后一个匹配元素的下标

    若找到则返回下标,否则返回-1

    内部使用严格相等进行比较

  • 填充数据:数组.fill()

    数组.fill(数据):将数组的所有元素填充为数据

    数组.fill(数据, 开始下标):将数组中从开始下标开始到末尾的元素填充为数据

    数组.fill(数据, 开始下标, 结束下标):将数组中从开始下标开始到结束下标为止,但不包含结束下标的元素填充为数据

    数据默认为undefined

    会考虑数组的empty位置

    如果你填充的是引用值,则数组的每个元素都将会变为该引用值

    var arr = new Array(2).fill({})
    
    console.log(arr[0] === arr[1]);		// true
    
  • 数组.join(分隔符)

    返回值为字符串,字符串是数组的每个元素拼接后的结果,相邻元素之间使用分隔符相连

    分隔符默认为","

    注意:empty元素会被join当做空串,如:new Array(3).join()得到",,"

  • 数组连接:数组1.concat(数组2, 数组3, ...)

    返回一个新数组,数组中的元素依次为数组1中的元素序列、数组2中的元素序列、数组3中的元素序列

    不会影响到数组1、数组2、数组3...

in关键字

in关键字用于判断属性是否属于某个对象,表达式的返回类型为boolean

格式:"属性名" in 对象

in关键字同样适用于数组,如下标 in 数组

该方法能够对原型链上的属性进行检测