Unit05: 创建和访问数组 、 数组的常用方法_1
1.数组:
程序=数据结构+算法;
数据:变量...
算法:if if-else switch 循环........
好的数据结构,可极大提高程序的执行“效率”;相关的多个数据应集中存贮,集中管理;
引用类型:值不保存在变量本地的数据类型; ************
数组:一组"连续的变量"组成的集合 ------- 统一起一个名字;******* 批量管理多个数据;
数组是引用类型的对象;
变量中保存了数组对象的地址,也成引用了数组对象;
如何使用:
1.创建: 4种;
1.var 变量名=[];
-->创建一个空数字对象;
2.var 变量名=[值1,值2,......值n]
-->创建数组同时,维数组指定初始元素;
3.var arr=new Array();
-->创建一个空数字对象
new:创建一个新对象,并返回新对象地址;
Array:js中的数组类型;
new Array():创建一个“数组类型”的“新对象”;并返回新对象的地址;
4.var arr=new Array(n);
-->创建n个元素的数组,但每个元素是空的;
new Array(值1,值2,......值n);
找到数组:使用变量等效于直接使用变量引用的数组对象;
在数组对象中,每个元素都有一个下标,每个元素的位置号;下标从0开始,到元素个-1结束;
使用数组的每个元素:
数组变量[i]-->获得i位置元素中的值;数组中的变量与普通变量用法完全一样;
2.赋值:数组变量[i]=新值;
3.取值:数组变量[i]
null 和 undefined
undefined:所有没有值得变量的默认值,自动复制。
null:主动释放一个变量的对象;
当使用完一个较大的对象时,“主动释放”对象;是好的习惯;
垃圾回收器:专门释放对象内存的一个程序;
底层,后台,伴随当前程序,同时运行;
引擎,会定时自动调用,垃圾回收器;
只有一个对象,不再被任何变量引用时,才会释放;
js中的数组 VS 其他语言的数组
js中的数组:下标超出不会出错;
为不存在的下标位置“赋值”:会自动创建指定下标的新元素;
为不存在的下标位置“取值”:不会出错,也不会增加新元素,而是返回 undefined;
console.log(),并不是完全顺序执行;可能异步执行;
“赋值表达式”的结果是“等号右边的值”;(demo1)************
1.length
数组是对象:封装了一组数据,并提供对数据的操作方法;
.length属性:获得数组中的元素个数 != 实际元素个数;
何时使用:
1.arr[arr.length-1]:获得任意长度数组中的最后一个;********
2.arr[arr.length]=新值;向数组末尾追加一个新元素;
2.arr.length改小,会删除length后面的项;
2.数组遍历
从下标0位置开始,依次取出每个元素,反复执行相同的操作;
三要素:
1.循环条件:下标从0开始,<length;
2.循环变量:下标i,从0开始,每次递增1,到length-1结束;
3.循环体:
3.关联数组
可以自己定义下标名称的数组;
如何创建关联数组:
1.先创建一个空数组:
var fbb=[];
fbb["name"]="范冰冰";
fbb["height"]="180cm";
fbb["age"]=35;
下标 值
下标必须带引号;
关联数组中的.length属性失效.**********
关联(哈希hash)数组:下标不能重复;****
赋值和取值都是,利用“哈希算法(算出一个数)”,快速"精确"定位某个下标的“位置”,不用遍历;*********
索引数组:缺点:下标自动分配,无意义,
要想按内容查找元素,只能从头开始遍历;
遍历关联(哈希hash)数组:
依次遍历arr中的元素,将当前元素的"下标"存入key中;**********
for(var key in arr){ 遍历数组中的每个key,in前面可以放任何变量
key:仅得到当前元素的下标;
arr[key]:得到当前元素的值;
}
(哈希hash)数组:保存的是key value对儿;去重复*********demo3;
4.冒泡排序 demo4
var arr=[4,2,5,3,8,7,6];
//遍历数组中每个元素
//下标从0开始,到<arr.length-1结束,下标++
//如果当前元素>下一个位置的元素 交换两元素的位置;
//声明变量pmt,用于交换;
/******
for(var i=0,tmp=0;i<arr.length-1;i++){
if(arr[i]>arr[i+1]){
tmp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=tmp;
}
}
//第n轮:n从1开始,到<length结束;
for(var i=0,tmp=0;i<arr.length-n;i++){
if(arr[i]>arr[i+1]){
tmp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=tmp;
}
}
*******/
for(var n=1;n<arr.length;n++){
for(var i=0,tmp=0;i<arr.length-n;i++){
if(arr[i]>arr[i+1]){
tmp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=tmp;
}
}
}
console.log(arr);
5.数组API
数组=数据+操作数据的API
1. 数组 to String:2种:
var str=arr.toString();
-->输出数组中的内容,每个元素用逗号分隔
-->自动调用
var str=arr.join("连接符")
-->输出数组中的内容,自定义元素间连接符
何时使用:2种固定套路
1. 将字符组成单词:arr.join("")
2. 将单词组成句子:arr.join(" ")
2. 拼接和截取:*API无法直接修改原对象,而返回新对象*
拼接:var newArr=arr.concat(另一个数组,值1,值2...)
复制子数组:var subArr=arr.slice(starti,endi+1);
含头不含尾
3. splice: 删除 插入 替换
1. 删除:直接修改原数组对象
[var deleted=]arr.splice(starti,删除个数)
返回本次删除元素组成的数组
2. 插入:
arr.splice(starti,0,新值1,...)
3. 替换:
arr.splice(starti,删除个数,新值1,...)
4. arr.reverse(); 颠倒数组中所有元素
优化:
1.问题:频繁字符串拼接,造成内存浪费;(频繁+=会有浪费的字符串;)
解决:先将要拼接的字符串放入数组;
最后 arr.join("");