1. 循环
1.1. 什么是:
让程序反复执行同一段代码
1.2. 何时:
- 只要让程序反复执行同一段代码
1.3. 如何: 三要素
- 循环条件: 让循环可以继续执行的条件
- 循环变量: 在循环条件中用作比较和判断的变量
- 从几开始, 每次 递增 / 递减几, 到几结束
- 循环反复执行的代码段
- 几乎都要修改循环变量, 向着不满足循环条件的趋势
1.4. 包括: 3 种
-
while循环:-
何时: 必须先验证循环条件, 才能执行循环体时
-
语法:
var 循环变量 = 初始值; // 声明并初始化循环变量 while(循环条件){ // 当满足循环条件时, 才进入循环执行 循环体; 修改循环变量 }
-
-
do while循环:-
何时: 希望即使不满足, 也至少可以执行一次时
-
语法:
var 循环变量 = 初始值; do{ 循环体; 修改循环变量 }while( 循环条件 ) -
对比
whilevsdo while- 如果第一次循环都满足, 两者第一次执行后的输出是完全一样的
while: 先验证后执行do while: 先执行一次, 再验证
- 如果第一次条件不满足, 则
while是一次都不执行,do while至少执行一次
- 如果第一次循环都满足, 两者第一次执行后的输出是完全一样的
-
-
for循环:-
语法:
for(var 循环变量 = 初始值; 循环条件; 修改循环变量){ 循环体; } -
for循环和while循环的原理是完全一样的 -
for vs while: 1. 如果循环变量的变化有规律: 首先for- 如果循环变量的变化没有规律: 首先
while
- 如果循环变量的变化没有规律: 首先
-
简写: 1. 第一部分: 可同时声明并初始化多个变量
-
循环体:
-
如果
for循环下只有一句话, 可省略{} -
如果
for循环下只有一句话,且很简单-
for循环的第三部分可先后执行多个短小的操作, 每个操作之间用逗号分隔 -> 不能改变原来的执行顺序- Ex:
for(var i = 1, sum = 0; i <= 100; sum += i, i++); document.write('和为:' + sum)
- Ex:
-
-
for循环条件可省略, 省略后是死循环
-
-
-
-
breakvscontinue:-
break: 中断并退出当前循环- 何时: 当判断条件非常复杂时, 就可用死循环 +
break的方式灵活控制循环退出 -> 降低循环编写的难度
- 何时: 当判断条件非常复杂时, 就可用死循环 +
-
continue: 跳过本轮循环, 继续执行下一轮- 只要颠倒判断条件, 就可避免使用
continue
- 只要颠倒判断条件, 就可避免使用
-
强调:
break不能参与到任何简写中, 必须独立一句
-
2. 数组
2.1. 什么是
内存中连续存储多个数据的一块存储空间, 再起一个统一的名字
2.2. 为什么
- 便于维护和查找
- 程序 = 数据结构 + 算法
- 数据结构: 数据在内存中的存储结构
- 算法: 解决问题的步骤
- 好的数据结构可极大提高程序的执行效率
2.3. 何时
- 今后只要保存多个同一类型的数据时, 都必须用数组
2.4. 如何: 3件事
-
创建数组
-
创建空数组:
-
语法:
var arr = []/var arr1 = new Array() -
何时: 创建数组时, 暂时不知道数组内容
-
-
创建数组同时初始化数组内容
- 语法:
var arr = [值1, 值2, ...]/var arr = new Array( 值1, 值2,...) - 何时: 创建数组时已知数组的内容
- 语法:
-
创建 n 个空元素的数组
- 语法:
var arr = new Array(n) - 何时: 创建数组时仅知道数组元素个数, 暂时不知道内容 ->
length为 n
- 语法:
-
下标: 数组中唯一标识一个元素存储位置的序号
-
从 0 开始, 连续不重复
-
- 在
new Array方法中, 参数为一个且为数字 n 时, 默认是 n 个空元素的数组; 为两个数字时, 则为声明赋值; 倘若里面的参数为字符串时, 则是为赋值
-
-
赋值: 将数据保存到数组的某个元素中
- 语法:
arr[i] = 新值-> 将 '值' 存入数组的下标为 i 的元素中
- 语法:
-
取值:
- 数组中每个元素的用法和普通的变量完全一样
- 数组也称为一组变量的集合, 起一个统一的变量名
- 如何使用数组中每个元素:
数组名[i]
2.5. JS数组的三个不限制
- 不限制元素的数据类型
- 原理:
JS中的每个元素都是变量, 变量是不限制类型的 -> 弱类型
- 原理:
- 不限制下标越界:
- 赋值: 不会报错 -> 自动在指定的新位置添加新元素
- 如果添加后, 数组的元素下标不连续 -> 稀疏数组
- 取值: 不会报错 -> 仅返回
undefined
- 不限制元素个数:
- 在任何时候,在任何位置添加新元素
2.6. length属性
length属性: 记录理论上数组中的元素个数length属性永远等于最后一个数字下标 + 1length属性永远指向最后一个元素的下一个新位置length可修改数组大小 -> 缩容- 固定套路: 1. 获取数组最后一个元素:
arr[arr.length - 1]2. 获得倒数第 n 个元素:arr[arr.length - n]3. 末尾追加一个新元素:arr[arr.length] = 新元素4. 删除数组最后一个元素:arr.length -= 15. 删除数组末尾倒数 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] //当前元素
}