js知识点梳理-Array

137 阅读3分钟

多个数据/元素组成的一个集合,保存在一个变量中

特点:

  • 数组中的元素都是按照线性来排列的:
    • 除了第一个元素,每个都有唯一的前驱元素
    • 除了最后一个元素,每个都有唯一的后继元素
  • 下标:数组中的每个元素都有一个唯一的位置序号,称为下标,用来表示数组中的每一个元素

1.创建数组

直接量方式

var arr=[];

var arr=[数据1,数据2,...];

构造函数方式

var arr=new Array();

var arr=new Array(数据1,数据2,...);

2.访问数组

获取数组:数组名[下标]

  • 下标越界,会获取undefined

添加数组:数组名[下标]=新数据;

  • 若该下标处已有元素,则为替换
  • 若下标越界,会导致数组变成稀疏数组,中间会出现很多undefined,且下标不再连续

数组的3不限:

  1. 不限制元素的长度
  2. 不限制元素的类型
  3. 不限制下标越界

3.数组对象(唯一属性)

数组名.length 获取到数组的长度

  • 向末尾添加元素 arr[arr.length]=新值
  • 获取倒数第n个元素 arr[arr.length-n]
  • 删除末尾的n个元素 arr.length-=n

4.遍历数组

将数组中的每个元素都取出来,执行相同或相似的操作

    for(var i=0;i<arr.length;i++){
        arr[i]//当前次获取到的元素
    }

5.如何释放一个引用类型

找清楚该引用类型由几个变量名引用着,每个变量都要释放

6.数组分类

  • 索引数组:下标都是数字组成的数组,默认数组
  • hash/关联数组:下标可自定义的数组

创建

  • 创建一个空数组 var arr=[]
  • 添加自定义下标并赋值 arr["自定义"]=值

访问

arr.["自定义下标"]

遍历

hash无法使用for循环,因为length失效,关联/hash数组length永远为0,下标也不为数字

for in循环 for(var i in 数组名){数组名[i];}

  • for in循环不仅可以遍历hash数组,也可以遍历索引数组,但for in不能自己设置从哪里开始,到哪里结束,仅能用于遍历
  • js中除undefined和null不是对象,其余皆为对象,且一切对象的底层都是hash数组

hash原理

  • hash算法:将字符串交给hash,会得到一个尽量不重复的数字,但若字符串内容相同,那么得到的数字也一定相同
  • 添加元素:将自定义的下标交给hash算法,会得到一个数字即地址值,再将要保存的数据放入地址
  • 获取元素:将指定的下标交给hash算法,会得到一个和添加时相同的数字即地址,则得到地址中保存的数据

数组的API

数组转为字符串

var str=arr.join("自定义连接符");

  • 若传入实参,则和toString/String相同,默认由,分隔
  • 固定使用
    • 提供给一个数组,无缝凭借里面的内容变为字符串:
    var str=join("");
    
    • 将数组中的数据拼接为页面上的元素:
    var str="<option>"+arr.join("</option><option>")+"</option>";
    

拼接数组,添加元素到末尾

var newArr=arr.concat(值1,arr1,...);

  • 此方法不修改原数组,只会返回一个新数组
  • 传参时支持数组参数,会悄悄打散数组,单独传入

截取字符串

从starti位置截取到endi位置,组成一个新数组

var subArr=arr.slice(starti,endi)

  • 此方法不修改原数组,只会返回一个新数组
  • 含头不含尾,从strati 到 endi-1,不含endi
  • 第二实参可以省略:从starti截到末尾
    • 浅拷贝:按值传递--第一实参也可以省略:从头截到尾
    • 深拷贝:复制了一个副本给对方
  • 支持负数参数,-1代表倒数第一个

删除、插入、替换

  • 删除:var dels=arr.splice(starti,n);//从starti开始删除n个
    • 特殊:此方法其实有返回值,所有删除的元素组成的一个新数组
  • 插入:arr.splice(starti,0,值1,...);//从starti开始删除0个,插入了新元素
    • 特殊:原来starti位置的元素以及后续元素都会被向后移动
  • 替换:var dels=arr.splice(starti,n,值1,...);
    • 特殊:插入的个数和删除的个数可以随意

翻转数组

arr.reverse();

排序

arr.sort(function(a,b){return a-b});

  • 默认按照字符串按位PK每个字符的unicode号排序
  • 按照数字排序
  • function(){}回调函数:不需要程序员调用的函数:悄悄的带有循环,提供了两个形参:a是后一个数,b是前一个数
  • return a-b
    • 如果a>b,返回是一个正数
    • 如果a<b,返回是一个负数
    • 如果a==b,返回是一个0,sort根据你反复的结果,来判断两者要不要交换位置

栈和队列

  • 开头进:arr.unshift(值1,...);
  • 开头出:var first=arr.shift();//一次只能删掉一个,并且会返回删除的元素
  • 结尾进:arr.push(值1,...);
  • 结尾出:var last=arr.pop();//一次只能删掉一个,并且会返回删除的元素

二维数组

创建 var arr=[["张三丰",128,3500],["张翠山",30,4500],["张无忌",18,5500]];

访问 arr[r][c];

  • 列下标越界:返回undefined
  • 行下标越界:报错:undefined不能使用[]

遍历二维数组:必然需要两个循环嵌套:外层循环控制行,内层循环控制列

for(var r=0;r<arr.length;r++){
    for(var c=0;c<arr[r].length;c++){
    console.log(arr[r][c]);
    }
}