程序=数据结构+算法
算法:程序执行的步骤
数据结构: 数据在内存中的存储结构
好的数据结构,可以极大提高程序的执行效率
什么是数组: 内存中连续存储多个数据的存储空间,再起一个名字。
其实就是多个变量的集合,起一个统一的名字
何时使用数组: 只要存储多个相关的数据,都要用数组集中存储。
如何使用数组:
创建:
1. 使用数组直接量,创建空数组:var arr=[];
2. 使用数组直接量,创建数组并初始化元素:
var arr=[值1,值2,.....];
3. 使用new创建空数组: var arr=new Array();
4. 使用new创建n个空元素的数组:
var arr=new Array(n);
5. 使用new创建数组并初始化元素:
var arr=new Array(值1,值2,....);
访问: 数组名[下标] ——元素
每个数组元素的用法和变量完全一样
特殊: 读取元素: 下标越界: undefined!
修改元素: 下标越界: 自动在新位置添加新元素
结果: 下标可能不连续。——稀疏数组
不限制:
1. 不限制元素的个数
2. 不限制元素类型
3. 不限制下标越界
数组的length属性: 记录的是数组的元素个数!
在稀疏数组中,实际元素个数,很可能小于length
但是,任何数组的length属性永远等于最大下标+1
数组最后一个元素的下标永远等于length-1
固定套路:
1. 最后一个元素: arr[arr.length-1]
2. 追加新元素: arr[arr.length]=新值;
3. 缩容/删除结尾的元素: arr.length-=n
数组是引用类型的对象:
多个变量可使用同一地址,引用同一个数组对象
一个变量释放对数组对象的引用,用null
垃圾回收器: 伴随主程序后台运行的,自动回收不再使用的对象的程序。
何时回收一个对象:如果一个对象的引用计数器为0
说明不再有变量引用该对象的地址
垃圾回收器就会释放对象所占的内存
建议:如果使用过较大的对象,在使用后,就要立刻释放。
遍历数组: for(var i=0;i<arr.length;i++){
//当前元素的值: arr[i]
}
索引数组: 下标都是数字的数组
关联(hash)数组:
什么是: 可自定义下标名称的数组
为什么: 索引数组的下标无具体意义,不便于查找
何时使用: 只要需要自定义数组下标时
——便于查找!
创建: 2步: 1. 创建空数组
2. 向空数组中添加指定下标名称的元素
访问: 数组名["下标"]
强调: hash数组的length失效!永远为0
遍历关联数组: for in
for(var key in hash){//自动依次获得每个元素的key
//当前元素: hash[key]
}//也可以遍历索引数组
***hash数组的原理:
hash算法: 将字符串,计算出一个尽量不重复的数字
字符串的内容相同,则计算的数字一定相同
添加元素: 将自定义下标名称交给hash算法,得到一个尽量不重复的地址序号。直接将元素值保存到序号对应的位置。
获取元素: 将指定的下表名称交给hash算法,得到一个和添加时完全相同的序号。直接访问序号所在的位置。
***不需要遍历!——查找速度和元素个数无关
3. ****数组API: 浏览器厂商已经实现的函数
程序员不需创建,直接使用。
1. arr to string:
1. var srt=String(arr) :
每个元素值之间用逗号分隔
2. var str=arr.join("连接符"):
可自定义连接符
省略"连接符",等效于String
固定套路:
1. 将字符拼接为单词(无缝拼接)
arr.join("")
问题: 频繁的字符串拼接会浪费内存
解决: 先将要拼接的子字符串,放入一个数组
最后将数组无缝拼接为字符串
2. 将数组拼接为页面元素
2. 拼接数组: 将concat后的参数,拼接到arr1之后
var newArr=arr1.concat(值1,值2,arr2,...)
强调: 1. concat不修改原数组,只能返回新数组
2. concat参数中的数组会被打散为单个元素再拼接
3. 获取子数组:
var subArr=arr1.slice(starti[,endi+1])
从arr1中截取starti位置到endi位置的元素组成的子数组
强调: 1. 不修改原数组,只能返回新的子数组
2. 含头不含尾
3. 省略第二个参数,表示从starti一直获取到结尾
4. splice: 删除,插入,替换
强调: 直接修改原数组!
删除: arr.splice(starti,n);
强调:其实splice也有返回值:
返回所有被删除的元素组成的子数组
var deletes=arr.splice(starti,n);
插入: arr.splice(starti,0,值1,值2,...)
强调: 原starti位置的元素及其之后的元素,被顺移
替换: arr.splice(starti,n,值1,值2,...)
从starti位置开始,删除n个元素,再插入新元素
强调: 删除的个数n,和插入新元素的个数不必相同
5. 翻转数组: arr.reverse();