1.***数组:
什么是: 内存中连续存储多个数据的数据结构,再起一个统一的名字
为什么: 普通的变量只能存储一个数据
程序=数据结构+算法:
算法: 解决问题的步骤
数据结构: 数据在内存中的存储结构
好的数据结构可以极大的提高程序的执行效率
何时: 只要存储多个连续的数据
如何创建: 3种:
1. 创建空数组: 2种:
1. 数组直接量: var arr=[];
2. 用new: var arr=new Array();
新建 数组
何时: 在创建数组时,还不知道数组中的元素内容时
2. 创建数组同时,初始化输出中的元素:
1. 数组直接量: var arr=[元素1,元素2,...];
2. 用new: var arr=new Array(元素1,元素2,...);
何时: 在创建数组时,已经知道数组的元素内容
3. 创建n个空元素的数组:
用new: var arr=new Array(n);
数组是引用类型的对象: vs 原始类型的值
原始类型的值: 数据直接保存在本地的数据类型,number, string, boolean, null, undefined
引用类型的对象: 数据无法直接保存在变量本地的数据类型
如何存储: 在变量之外开辟独立的存储空间。变量中仅保存外部存储空间的地址
回顾: 按值传递:
两个变量间赋值时,或将变量作为参数传入函数时,其实只是将原变量中的值复制一个副本给对方!
结果: 对原始类型的值: 修改新变量,不影响原变量
为什么: 复制的是原始的值
对引用类型的对象: 通过新变量修改对象,等效于直接修改原对象。
为什么: 仅复制地址值,原对象不增加
垃圾回收: 引擎会自动释放不再使用的对象的空间
垃圾回收器: 自动记录对象的引用次数,并释放不再被任何变量引用的对象的 小程序
伴随js主程序并行执行。
原理: 创建对象时,每个对象都有一个属性:引用计数器,用来记录引用对象的变量个数
*如果变量不再使用对象时,要将变量赋值为null*
对象的引用计数器-1
垃圾回收器会自动寻找引用计数器为0的对象,释放
访问数组中的元素:
元素: 数组中每个数据都是一个元素
如何访问: 下标: 数组中唯一标识每个元素存储位置的序号
特点: 从0开始,连续不重复
何时: 只要访问数组元素,只能用下标
如何: 数组名[i]——用法和单个变量完全一样!
数组的length属性: 记录了数组中理论上的元素个数
length属性的值永远是最大下标+1
固定套路:
1.获得数组最后一个元素: arr[arr.length-1]
2.获得倒数第n个元素的位置: arr[arr.length-n]
3.在数组末尾追加一个新元素: arr[arr.length]=新值
4.数组缩容: 减小arr.length的数值,会删除结尾的多余元素。
5.遍历数组: 依次访问数组中每个元素,对每个元素执行相同的操作
for(var i=0;i<arr.length;i++){
arr[i]//当前正在遍历的元素
}
特殊: 三个不限制:
1. 不限制数组的元素个数:长度可变
2. 不限制下标越界:
获取元素值: 不报错!返回undefined
修改元素指: 不报错! 自动在指定位置创建新元素,并且自动修改length属性为最大下标+1
如果下标不连续的数组——稀疏数组
3. 不限制元素的数据类型:
1. ***关联数组:
索引数组: 下标为数字的数组
什么是关联数组: 可自定义下标名称的数组
为什么: 索引数组中的数字下标没有明确的意义
何时: 只要希望每个元素都有专门的名称时
如何: 2步:
1. 创建空数组
2. 向空数组中添加新元素,并自定义下标名称
索引数组 vs 关联数组:
1. 已字符串输出 不能用字符串输出
2. 下标是数字 下标是自定义的字符串
3. length属性有效 length属性失效(=0)
4. 访问元素,都用数组名["下标"]
5. 可用for循环遍历 不能用for循环遍历——for in
遍历关联数组: for in循环
for(var key in hash){
key//只是元素的下标名
hash[key]//当前元素值
}
***其实: js底层,一切对象都是关联数组:
比如: 索引数组,window等
hash: 散列算法,接受一个字符串,并计算出尽量不重复的序号
不同的字符串,计量计算出不同的序号
相同的字符串,一定计算出相同的序号
关联数组,也叫hash数组
原理:
存入元素: 将字符串类型的元素名,交给hash算法,计算出一个尽量不重复的数字。再将元素值,存入数字表示的位置
获取元素: 将要查找的元素名, 交给hash算法,计算出和存入时完全一致的序号,直接到序号标识的位置获取元素值。
查找: 索引 hash数组
遍历 不用遍历
受存储位置影响 和存储位置无关
受数组元素个数影响 和数组中元素个数无关
总结: 今后只要希望快速查找元素时,就用hash数组
数组API:
1.数组转字符串:
1. String(arr): 将arr中每个元素转为字符串,用逗号分隔
固定套路: 对数组拍照: 用于鉴别是否数组被修改过
2. arr.join("连接符"): 将arr中每个元素转为字符串,用自定义的连接符分隔
固定套路:
1.将字符组成单词: chars.join("")->无缝拼接
扩展: 判断数组是空数组: arr.join("")==""
2.将单词组成句子: words.join(" ")
3.将数组转化为页面元素的内容: