循环、数组

152 阅读5分钟

1. 循环

1.1. 什么是:

让程序反复执行同一段代码

1.2. 何时:
  • 只要让程序反复执行同一段代码
1.3. 如何: 三要素
  1. 循环条件: 让循环可以继续执行的条件
  2. 循环变量: 在循环条件中用作比较和判断的变量
    • 从几开始, 每次 递增 / 递减几, 到几结束
  3. 循环反复执行的代码段
    • 几乎都要修改循环变量, 向着不满足循环条件的趋势
1.4. 包括: 3 种
  1. while 循环:

    • 何时: 必须先验证循环条件, 才能执行循环体时

    • 语法:

      var 循环变量 = 初始值; // 声明并初始化循环变量
      while(循环条件){ // 当满足循环条件时, 才进入循环执行
      	循环体;
      	修改循环变量
      }
      
  2. do while 循环:

    • 何时: 希望即使不满足, 也至少可以执行一次时

    • 语法:

      var 循环变量 = 初始值;
      do{
      	循环体;
      	修改循环变量
      }while( 循环条件 )
      
    • 对比 while vs do while

      • 如果第一次循环都满足, 两者第一次执行后的输出是完全一样的
        • while: 先验证后执行
        • do while: 先执行一次, 再验证
      • 如果第一次条件不满足, 则 while 是一次都不执行, do while 至少执行一次
  3. for 循环:

    • 语法:

      for(var 循环变量 = 初始值; 循环条件; 修改循环变量){
           循环体;
      }
      
    • for 循环和 while 循环的原理是完全一样的

    • for vs while: 1. 如果循环变量的变化有规律: 首先 for

      1. 如果循环变量的变化没有规律: 首先 while
    • 简写: 1. 第一部分: 可同时声明并初始化多个变量

      1. 循环体:

        • 如果 for 循环下只有一句话, 可省略 {}

        • 如果 for 循环下只有一句话,且很简单

          • for 循环的第三部分可先后执行多个短小的操作, 每个操作之间用逗号分隔 -> 不能改变原来的执行顺序

            • Ex:
              for(var i = 1, sum = 0; i <= 100; sum += i, i++);
              document.write('和为:' + sum) 
              
        • for 循环条件可省略, 省略后是死循环

  4. break vs continue:

    • break: 中断并退出当前循环

      • 何时: 当判断条件非常复杂时, 就可用死循环 + break 的方式灵活控制循环退出 -> 降低循环编写的难度
    • continue: 跳过本轮循环, 继续执行下一轮

      • 只要颠倒判断条件, 就可避免使用 continue
    • 强调: break 不能参与到任何简写中, 必须独立一句

2. 数组

2.1. 什么是

内存中连续存储多个数据的一块存储空间, 再起一个统一的名字

2.2. 为什么
  • 便于维护和查找
  • 程序 = 数据结构 + 算法
    • 数据结构: 数据在内存中的存储结构
    • 算法: 解决问题的步骤
    • 好的数据结构可极大提高程序的执行效率
2.3. 何时
  • 今后只要保存多个同一类型的数据时, 都必须用数组
2.4. 如何: 3件事
  1. 创建数组

    1. 创建空数组:

      • 语法: var arr = [] / var arr1 = new Array()

      • 何时: 创建数组时, 暂时不知道数组内容

    2. 创建数组同时初始化数组内容

      • 语法: var arr = [值1, 值2, ...] / var arr = new Array( 值1, 值2,...)
      • 何时: 创建数组时已知数组的内容
    3. 创建 n 个空元素的数组

      • 语法: var arr = new Array(n)
      • 何时: 创建数组时仅知道数组元素个数, 暂时不知道内容 -> length 为 n
    4. 下标: 数组中唯一标识一个元素存储位置的序号

      • 从 0 开始, 连续不重复

    • new Array 方法中, 参数为一个且为数字 n 时, 默认是 n 个空元素的数组; 为两个数字时, 则为声明赋值; 倘若里面的参数为字符串时, 则是为赋值
  2. 赋值: 将数据保存到数组的某个元素中

    • 语法: arr[i] = 新值 -> 将 '值' 存入数组的下标为 i 的元素中
  3. 取值:

    • 数组中每个元素的用法和普通的变量完全一样
    • 数组也称为一组变量的集合, 起一个统一的变量名
    • 如何使用数组中每个元素: 数组名[i]
2.5. JS数组的三个不限制
  1. 不限制元素的数据类型
    • 原理:JS 中的每个元素都是变量, 变量是不限制类型的 -> 弱类型
  2. 不限制下标越界:
    • 赋值: 不会报错 -> 自动在指定的新位置添加新元素
    • 如果添加后, 数组的元素下标不连续 -> 稀疏数组
    • 取值: 不会报错 -> 仅返回 undefined
  3. 不限制元素个数:
    • 在任何时候,在任何位置添加新元素
2.6. length属性
  • length 属性: 记录理论上数组中的元素个数
  • length 属性永远等于最后一个数字下标 + 1
  • length 属性永远指向最后一个元素的下一个新位置
  • length 可修改数组大小 -> 缩容
  • 固定套路: 1. 获取数组最后一个元素: arr[arr.length - 1] 2. 获得倒数第 n 个元素: arr[arr.length - n] 3. 末尾追加一个新元素: arr[arr.length] = 新元素 4. 删除数组最后一个元素: arr.length -= 1 5. 删除数组末尾倒数 n 个元素: arr.length -= n
2.7. 数组是引用类型的对象
  • 按值传递:
    • 原始类型的值 -> 修改新变量, 不影响原变量
      • 原因: 复制的是值本身
    • 引用类型的对象: 通过新变量修改对象, 等效于直接修改原对象 -> 新旧变量都受影响
      • 原因:
        • 仅复制的是地址值, 原对象始终只有一个
        • 新旧变量使用相同的地址值, 引用同一个对象
        • 任何一方修改对象, 另一方都同时受影响
2.8. 遍历
2.8.1. 什么是:

对数组中每个元素执行相同的操作

2.8.2. 何时:

只要对数组中每个元素执行相同的操作

2.8.3. 如何
for(var i=0; i < arr.length; i++){
  arr[i] //当前元素
}