1.数组(Array)
数组也是一种复合数据类型,在数组组中可以存储不同类型的数据。存储的数据是有序的,每个数据都有唯一索引(index)。
创建数组
let a = new Array() let a = []
注: 如果读取数组中不存在的元素,不报错而是返回undefined.tyeof 返回object 向数组最后添加元素:a[a.length]=元素
length是可以修改的:a.length=5 ,长度变长会有空元素,长度变短会删除元素。
遍历数组
//正着遍历 for(let i=0;i<arr.length;i++){ arr[i] }
//倒着遍历 for(let i=arr.length-1;i>=0;i--){ arr[i] }
//可定制性没有for循环灵活,用来遍历柯迭代对象包括遍历字符串内容 for(let item of arr){ console.log(item) }
//判断是否是素组
let a=[1,2] a.isArray(a)//true
//获取数组中一个元素
let arr = [1,2,3,4] arr[0] //1 不可传入负值 arr.at(0) //1 可以传入负值 arr.at(-1) //4 等价于 arr[arr.length-1] 4
//数组连接可连接多个
concat不会破坏原来数组结构,不会影响原数组,生成新数组。 let a = [1,2] let b = [3,4] let c = a.concat(b)
//indexOf() 数组是否存在某个元素第一次出现的下标
let a=[1,2,3] let r=a.indexOf(1) //检查是否有1,返回下标0
let r=a.indexOf(1,3) //第二个参数是其实位置,从下标3开始查询。
没有找到返回-1
//join 数组变成字符串
let a = [1,2,3,4] let r= a.join() //"1,2,3,4" 用逗号分开
join("-")//将默认连接符逗号换成-
slice 截取数组,对原数组没有影响
let a= [1,2,3,4] let r= a.slice(0,2) //[1,2] 第一个参数截取位置包括截取位置,第二个参数结束位置,不包括截取位置。 let r= a.slice(1) //[2,3,4] 从索引1一直截取到最后 let r= a.slice() // [1,2,3,4] 对数组进行浅复制
如:
let a = [1,2]
let b=a
这种不叫复制,只是将地址进行赋值,影响到原数组,复制是会产生新的对象。
变量一个存储空间,存储值地址。 值一个存储空间,存的两个值地址,指向两个值
let a = [1,2]
let b= a.slice()
b===a //false
浅拷贝,深拷贝
存储原始值,不区分深浅拷贝,针对对象数据 let a = [ {name:"李四"} ]
浅拷贝只复制了第一层,不会复制下一层属性或元素,只是复制对象本身,所以还是会影响到下一层元素修改。
深拷贝不仅复制对象本身,还复制对象中的属性或元素,但因为性能问题,不建议多层次深拷贝。
structuredClone进行深拷贝
let b=structuredClone(a)
扩展使用展开运算符进行浅拷贝
let a =[1,2,3] let b= [a[0],a[1],a[2]] //将a数组中的数据一个一个放入新数组中。 let c=[...a] 等价于 let b= [a[0],a[1],a[2]] let c=[2,...a,5]//还可以添加其他数据
对象浅拷贝assign let a = {name:"李四"} let b =Object.assign({},a) //把后边对象属性赋值到前面新对象中,第一个参数目标对象,第二个参数被复制对象,相同属性被覆盖
展开运算符进行拷贝 let c = {...a} 等价于let b =Object.assign({},a)
push
数组末尾添加元素,返回数组长度 let a = [1,2] a.push(3)
pop
删除数组最后一个元素,返回值返回删除的元素 let a = [1,2] a.pop()
unshift
数组开头添加元素,返回数组长度 let a = [1,2] a.unshift(3)
shift
删除数组前面元素 let a = [1,2] a.shift()
splice
删除,插入,替换数组元素 let a = [1,2] //第一个参数删除起始位置,第二个参数删除数量,返回被删除的元素 a.splice(1,1) //第三个参数索引为一1的位置变成3.删除并替换。 a.splice(1,1,3) //第二个参数为0,变成插入数据,插入索引为1的前面 a.splice(1,0,3)
reverse
反转 let a = [1,2,3] a.reverse // [3,2,1]
数组去重
let a= [1,2,4,3,4,6,7,8,9,4]
方法一:将元素分别进行比较删除重复的。 for(let i=0;i<a.length;i++){ //当前值后面的值 for(let j=i+1;j<a.length;j++){ if(a[i]===a[j]){ a.splice(j,1) } }
} 但是当连续出现重复数据时,失效。当删除一个重复的,下一个重复数据会向前补位,因为之前位置对比过,所以不会再进行对比, let a= [1,2,4,3,4,4,4,6,7,8,9,4]
for(let i=0;i<a.length;i++){ //当前值后面的值 for(let j=i+1;j<a.length;j++){ if(a[i]===a[j]){ a.splice(j,1) 解决办法,删除之后,这个位置在比较下 j-- } }
}
方法二: let a= [1,2,4,3,4,4,4,6,7,8,9,4] for(let i=0;i<a.length;i++){ //从当前下标下一个开始查找,下一个是否有相同的元素
let index= a.indexOf(a[i],i+1) if(index!==-1){ a.splice(index,1) i-- } }
方法三: let a=[1,2,4,3,4,4,4,6,7,8,9,4] let b= [] for(let ele of a){ //新数组没有元素,加入新数组 if(b.indexOf(ele)===-1){ b.push(ele) } }