什么是:让程序反复执行同一代码段
如何使用:
三要素:
1.循环条件: 让循环可以继续反复执行的条件。
2.循环变量: 在循环条件中,用作比较的变量。
循环变量总是向着不满足循环条件的趋势变化。
3.循环体: 循环反复执行的代码段。
三种:
1.当循环变量的变化没有规律时
var 循环变量=值;
while(循环条件){
循环体;
迭代变化循环变量
}
2.先执行循环体,再判断循环条件,决定是否继续。
var 循环变量=值;
do{
循环体;
迭代变化循环变量
}while(循环条件);
while vs do while : 只看第一次循环条件是否满足!
如果第一次条件都满足,则两者完全等效
如果第一次条件不满足,则:
while是一次都不执行
do while至少可执行一次
总结:退出循环:
1.用循环条件——优雅,难度大——建议
2.用break——野蛮,随意,简单!
3.当循环条件的变化有规律时:
for(var 循环变量=值;
循环条件;
迭代变化循环变量){
循环体;
}
特殊写法:
1.第一部分中:可同时声明并初始化多个变量。
2.第三部分中:可同时执行多个短小的操作,用逗号分隔。强调:不能修改原执行顺序
3.死循环: while(true) for(;;)
补:其实,if,else,for,while,之后只有一句话
可省略{}——禁止使用
复杂循环:2步:
1. 截取片段,总结公式
2. 用循环,反复调用公式
1.***数组:
什么是:内存中连续存储多个数据的存储空间,再起一个名字。
数组是引用类型的对象
为什么: 程序=数据结构+算法
算法:解决问题的步骤
数据结构:数据在内存中的组织结构
好的数据结构,可以极大提高程序的执行效率
何时使用: 存储一组相关的数据时,就要用数组。
如何使用:
1. 创建:3个场景
1.创建一个空数组:2种:
var arr=[]; //创建一个新数组
var arr=new Array();
创建 数组
何时使用:创建数组时,不确定数组元素的内容。
2.创建数组同时,初始化数组元素:
var arr=[值1,值2,...];
var arr=new Array(值1,值2,...);
创建 数组 向数组中加入...
何时使用:创建数组时,已经知道每个元素的内容。
3.创建n个空元素的数组:
var arr=new Array(n);
创建 n个空元素的数组
何时使用:创建数组时,仅知道将来的元素个数,不确定元素内容时。
2. 访问数组元素:
先找到数组变量,再使用下标在数组内找到指定位置的元素。
下标:数组中唯一标识一个元素的存储位置的序号。默认从0开始,连续递增,不重复。
比如: arr[i] 访问arr数组中下标为i位置的元素。
每个元素的用法和普通变量,完全一样!
数组:一组变量的集合,再起一个统一的变量名。
补: 垃圾回收: 清除不再使用的对象,释放存储空间。
对象:内存中存储多个数据的存储空间
对象占用的内存比普通变量大
垃圾回收进程(器):是一个专门负责释放不再使用的对象的小程序。
js引擎自带,自动执行的,后台程序
对象生命周期:(垃圾回收的原理)
1.创建对象时,垃圾回收器会标记该对象的引用计数器为1
引用计数器: 记录一个对象被几个变量引用着。
2.使用对象过程中,只要多一个变量引用该对象,计数器就+1
3.主动为一个变量赋值为null时,就释放了该变量对对象的引用。计数器就会-1
4.如果一个对象不再被任何变量引用,计数器就变为0。垃圾回收就释放对象。
建议:在使用完一个较大的对象后,都要主动用null释放对该对象的引用。
强调:三大差别:(三个不限制)
1. 不限制数组元素的个数
可随时在任何位置,添加新元素:
只要为该位置强行赋值,数组就会自动在该位置创建一个新元素
2. 不限制元素的数据类型
3. 不限制下标越界
js中数组越界不报错!而是返回undefined
数组的length属性:表示数组中,元素的个数
固定套路:
1. 如何获得数组最后一个元素:
arr[arr.length-1]
数组的length属性,永远是最大下标+1
如何获得数组倒数第n个元素:
arr[arr.length-n]
2. 如何在数组默认追加新元素:
arr[arr.length]=新值
稀疏数组: 数组元素的下标,不连续的数组。而length属性却始终是最大下标+1.
3. 数组缩容: arr.length-n
数组遍历:依次获取数组中每个元素,对每个元素执行相同的操作。
for(var i=0;i<arr.length;i++){
arr[i]//当前正在遍历的元素
}
索引数组:下标都是数字的数组
***关联数组:
什么是:可自定义下标名称的数组
为什么:索引数组的下标没有实际意义
"范冰冰" 89 65 91
name math chs eng
何时使用:只要希望每个元素有特定的意义,就要自定义下标名称。
如何创建: 2步:
1. 先创建一个空数组;
2. 向数组中添加新元素,下标要用自定义的字符串,作为名称。
关联数组中的length失效,永远为0
遍历关联数组中每个属性:
for(var key in arr){
arr[key]//当前属性值
}
in: 依次获取arr中每个属性名
key: 用来保存in本次返回的属性名
关联数组,也称为hash数组:
hash(散列)算法:接收一个字符串,计算出一个尽量不重复的序号。
特点:
不同字符串,尽量算出不重复的数字。
同一个字符串,算出的结果,一定相同
所以,hash中的下标(key)不可重复,唯一
存储:先将该元素的下标名称交给hash算法,计算出一个尽量不重复的存储位置。将数据保存到该位置。
取值:将要查找的下标名称交给hash算法,计算出和存储时完全一致的位置。直接通过地址找到元素。
索引数组: 查找未知位置的元素,只能靠遍历。缺:受元素个数和元素存储位置的影响极大
hash数组: 只要知道元素的属性名,不需要遍历,即可直接获得元素的内容。
优:查找速度极快,且和元素个数和存储位置无关。
数组API:
数组:封装一组连续的数据,并提供对数据进行操作的API
1.to str: 2种:
1.String(arr): 将数组中每个元素转为字符串,并用逗号连接。——拍照
2.arr.join("连接符"):将数组中每个元素转为字符串,用自定义的"连接符"连接每个元素。
固定套路:
1. 无缝拼接: var str=arr.join("")
2. 将数组中的元素,拼接为页面的html代码
2.拼接和截取: 都无法直接修改原数组
而是返回新数组,用变量接住 拼接:
var newArr=
arr1.concat(值1,值2,arr2,值3,...)
将值1,值2...拼接到arr1之后,生成新数组,原arr1数组保持不变。
强调:concat可打散数组类型的参数,逐个元素拼接。
截取子数组:
var subArr=arr.slice(starti,endi+1);
复制出arr中starti位置开始,到endi位置的元素组成新数组返回。
强调:
1. 含头不含尾,结束位置要+1
2. 支持负数参数:表示倒数第n个位置
其实执行的还是length-n
3. 如果省略第二个参数,表示从starti位置直接截取到结尾。
splice: 删除元素,插入元素,替换元素
直接修改原数组
删除: arr.splice(starti,n)
删除arr中starti位置开始的n个元素
其实,splice方法会返回被删除的元素组成的临时数组。用于后续的操作。
插入:
arr.splice(starti,0,值1,值2,...)
在arr的starti位置插入值1,值2,...,
原starti位置的值及其之后的值自动向后顺移。
splice不支持数组类型的参数,无法打散数组。
替换: arr.splice(starti,n,值1,值2,..)
先删除starti位置的n个元素
再在starti位置插入值1,值2,...
颠倒数组中的元素: 直接修改原数组
arr.reverse();只是机械的将数组颠倒