JavaScript数组详解-全⽹最全定义数组的⽅式
定义数组的⽅式有多种,分别如下
l e t a r r a y=[](字⾯量)
l e t a r r a y=n e w A r r a y()
l e t a r r a y=n e w A r r a y([l e n g t h])l e n g t h表⽰长度
l e t a r r a y=n e w A r r a y(a r g1,a r g2,a )
l e t a r r a y=[];//初始化⼀个空数组
l e t a r r a y2=n e w A r r a y();//初始化⼀个空数组
l e t a r r a y3=n e w A r r a y(10);//初始化⼀个长度为10的数组,数组的每⼀项都是e m p t y
l e t a r r a y4=n e w A r r a y(10,20,30,40);//初始化⼀个长度为4的数组,数组的项分别为10,20,30,40
其中在开发中,l e t a r r r a y=[]使⽤的最多,也是推荐的。
数组的增删改查
数组的新增
定义⼀个数组之后需要向数组中添加对应的项,这⾥先介绍⼏种简单的处理⽅法。
a r r a y[i n d e x]=x x x
a r r a y[a r r a y.l e n g t h]=x x x
l e t a r r a y=[];
a r r a y[0]=100;
a r r a y[1]=200;
c o n s o l e.l o g(a r r a y);//100,200
l e t a r r a y2=[10,20];
a r r a y2[a r r a y.l e n g t h]=30;
c o n s o l e.l o g(a r r a y2);//102030
数组的修改
如果需要修改的项存在则执⾏修改操作,不存在执⾏新增操作
l e t a r r a y=[];
a r r a y[0]=100;
a r r a y[1]=200;
c o n s o l e.l o g(a r r a y);//100,200
a r r a y[1]=300;//项存在,执⾏修改操作
c o n s o l e.l o g(a r r a y);//100300
数组的删除
a r r.l e n g t h=x x x x x x⼩于数组的长度就可以删除项
l e t a r r a y=[];
a r r a y[0]=100;
a r r a y[1]=200;
c o n s o l e.l o g(a r r a y);//100,200
a r r a y.l e n g t h=0;
c o n s o l e.l o g(a r r a y);//[]
数组的查询
循环遍历每⼀项,f o r循环,f o r E a c h循环等等
下标(索引)获取,a r r a y[i n d e x]其中i n d e x表⽰索引
l e t a r r a y=[10,20,30,40,50];
c o n s o l e.l o g(a r r a y[0]);//获取数组的第⼀项10
f o r(l e t i=0;i<a r r a y.l e n
g t h;i++){
c o n s o l e.l o g(a r r a y[i]);//遍历数组的每⼀项10,20,30,40,50
}
检测数组的⽅法和数组的length属性
初始化数组之后,数组⾃带有⼀个l e n g t h属性,表⽰数组的长度,这⾥就不再进⾏介绍了,检测数组的⽅法有i n s t a n c e o f和
A r r a y.i s A r r a y()
l e t a r r a y=[10,20,30,40,50];
c o n s o l e.l o g(A r r a y.i s A r r a y(a r r a y));//t r u e
c o n s o l e.l o g(a r r a y i n s t a n c e o f A r r a y);//t r u e
我们知道数组是对象,既然是对象就必然离不开属性(l e n g t h)和⽅法,关于属性l e n g t h,就那啥了,你们懂的,主要介绍⼀下数组的⽅法,这⾥分为E S5数组常⽤的⽅法和E S6数组的⽅法。
ES5数组常⽤的⽅法
转换⽅法
A r r a y.t o S t r i n g():将数组变成由逗号分割的字符串
A r r a y.v a l u e O f():返回数组本⾝
l e t a r r a y=[10,20,30,40,50];
c o n s o l e.l o g(a r r a y.t o S t r i n g());//10,20,30,40,50
c o n s o l e.l o g(a r r a y.v a l u e O f());//[10,20,30,40,50]
栈⽅法(遵循后进先出的原则)
A r r a y.p u s h():将⼀个或多个元素添加到数组的末尾,并返回该数组的新长度
A r r a y.p o p():从数组中删除最后⼀个元素,并返回该元素的值。此⽅法更改数组的长度
l e t a r r a y=[];
a r r a y.p u s h(10,20,30,40,50,60);
c o n s o l e.l o g(a r r a y);//10,20,30,40,50,60
l e t i t e m=a r r a y.p o p();
c o n s o l e.l o g(i t e m);//60
c o n s o l e.l o g(a r r a y);//10,20,30,40,50
注意:数组的⽅法不⽀持推⼊整个数组,例如a r r.p u s h([1,2,3])不会是1,2,3,[1,2,3]只会作为数组中的⼀项,如果想
实现,可以使⽤E S6的扩展运算符...
l e t a r r a y=[10,20,30,40];
l e t a r r a y1=[50,60,70,80];
a r r a y.p u s h(...a r r a y1);//使⽤扩展运算符
c o n s o l e.l o g(a r r a y);//10,20,30,40,50,60,70,80
队列⽅法(遵循先进先出的原则)
A r r a y.s h i f t():从数组中删除第⼀个元素,并返回该元素的值。此⽅法更改数组的长度
A r r a y.u n s h i f t():⽅法将⼀个或多个元素添加到数组的开头,并返回该数组的新长度(该⽅法修改原有数组)
l e t a r r a y=[10,20,30,40];
l e t i t e m=a r r a y.s h i f t();
c o n s o l e.l o g(i t e m);//10
c o n s o l e.l o g(a r r a y);//20,30,40
a r r a y.u n s h i f t(100,200,300);
c o n s o l e.l o g(a r r a y);//100,200,300,20,30,40
重排序⽅法
A r r a y.r e v e r s e():将数组中元素的位置颠倒,并返回该数组。数组的第⼀个元素会变成最后⼀个,数组的最后⼀个元素变成第⼀
个。该⽅法会改变原数组
A r r a y.s o r t():对数组的元素进⾏排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后⽐较它们的U T F-16代码单元值
序列时构建的
l e t a r r a y1=[10,20,30,40,50];
a r r a y1.r e v e r s e();
c o n s o l e.l o g(a r r a y1);//50,40,30,20,10
l e t a r r a y2=[10,5,20,30,40,50];
a r r a y2.s o r t();
c o n s o l e.l o g(a r r a y2);//10,20,30,40,5,50
控制台输出可以看到,s o r t排序⽅法并没有实现我们期望的结果5,10,20,30,40,50,这是因为⾸先s o r t会调⽤每个数组项的
t o S t r i n g()转型⽅法,然后⽐较得到的字符串,如果要实现期望的结果,可以在s o r t中传⼊⼀个函数实现排序。
A r r a y.s o r t(f u n c t i o n(a,b){})
a:⽤于⽐较的第⼀个参数
b:⽤于⽐较的第⼆个参数
如果第⼀个参数应该位于第⼆个参数之前则返回⼀个负数,如果两个参数相等则返回0,如果第⼀个参数应该位于第⼆个参数之后则返回⼀个正数。
A r r a y.s o r t()实现升序
l e t a r r a y=[10,20,40,50,30];
f u n c t i o n c o m p a r e(x,y){
i f(x<y){
r e t u r n-1;
}e l s e i f(x>y){
r e t u r n1
}e l s e{
r e t u r n0
}
}
a r r a y.s o r t(c o m p a r e);
c o n s o l e.l o g(a r r a y);//10,20,30,40,50
经过排序之后,得到了排序之后升序的结果,如果想要实现降序,将位置调换⼀下就可以了
A r r a.s o r t()实现降序
l e t a r r a y=[10,20,40,50,30];
f u n c t i o n c o m p a r e(x,y){
i f(x<y){
r e t u r n1;
}e l s e i f(x>y){
r e t u r n-1
}e l s e{javascript数组对象
r e t u r n0
}
}
a r r a y.s o r t(c o m p a r e);
c o n s o l e.l o g(a r r a y);//50,40,30,20,10
如果是对于数值类型或者其v a l u e O f()⽅法会返回数值类型的对象类型,可以直接使⽤第⼀个参数减去第⼆个参数
操作⽅法
A r r a y.c o n c a t():⽤于合并两个或多个数组。此⽅法不会更改现有数组,⽽是返回⼀个新数组
A r r a y.s l i c e([s t a r t,e n d]):可以接受⼀或两个参数,即返回项的起始位置和结束位置,只有⼀个参数,返回该参数指定位置到当前
数组末尾的所有项,如果有两个参数,该⽅法返回起始位置到结束位置之间的项(但不包括结束位置的项)
A r r a y.s p l i c e():
删除=>可以删除任意数量的项,只需指定两个参数,要删除第⼀项的位置和要删除的项数
插⼊=>可以向指定位置插⼊任意数量的项,只需提供3个参数,起始位置,0,要插⼊的项,如果要插⼊多个项,可以传⼊第n 项,第n+1项,...
替换=>可以向指定位置插⼊任意数量的项,且同时删除任意数量的项,只需指定3个参数,起始位置,要删除的项数和要插⼊的的任意数量的项,插⼊的项数不必与删除的项数相等
A r r a y.j o i n():使⽤不同的符号连接数组
A r r a y.c o n c a t()
l e t a r r a y=[10,20,30,40];
l e t a r r a y1=[50,60];
l e t n e w A r r a y=a r r a y.c o n c a t(a r r a y1);
c o n s o l e.l o g(n e w A r r a y);//10,20,30,40,50,60
l e t a r r a y2=a r r a y.c o n c a t('20',[50,60],80);
c o n s o l e.l o g(a r r a y2);//10,20,30,40,20,50,60,80
A r r a y.s l i c e(s t a r t,e n d)
s t a r t:表⽰起始位置的索引
e n d:表⽰结束位置的索引
l e t a r r a y=[10,20,30,40,50,60,70];
l e t a r r a y=[10,20,30,40,50,60,70];
l e t a r r a y1=a r r a y.s l i c e(1);//没有结束位置,表⽰从起始位置到数组末尾
c o n s o l e.l o g(a r r a y1);//20,30,40,50,60,70
l e t a r r a y2=a r r a y.s l i c e(2,5);//起始位置的索引为2,结束位置的索引为5(不包括结束位置)
c o n s o l e.l o g(a r r a y2);//30,40,50
注意:如果s l i c e()⽅法中起始位置或结束位置中有负数,则⽤数组的长度加上该数来确定,举个例⼦:
在⼀个包含5项的数组中s l i c e(-2,-1)和s l i c e(3,4)是⼀样的,如果结束位置⼩于起始位置则返回空数组。
A r r a y.s p l i c e(i n d e x,i t e m)实现删除操作
l e t a r r a y=[10,20,30,40,50];
a r r a y.s p l i c e(2,2);//从索引2开始删除两项
c o n s o l e.l o g(a r r a y);//10,20,50
A r r a y.s p l i c e(s t a r t,0,a d d I t e m)实现新增操作
l e t a r r a y=[10,20,30];
a r r a y.s p l i c e(1,0,40,50,60);//从下标1开始删除0项,新增40,50,60这三项
c o n s o l e.l o g(a r r a y);//10,40,50,60,20,30
A r r a y.s p l i c e(s t a r t,d e l e t e I t e m,a d d I t e m)实现修改操作
l e t a r r a y=[10,20,30,40,50,60,70];
a r r a y.s p l i c e(2,2,90,100,110);//从下标2开始删除2项,插⼊90,100,110这三项
c o n s o l e.l o g(a r r a y);//10,20,90,100,110,50,60,70
需要注意的⼀点是:插⼊项的时候是插⼊当前删除项的前⾯
A r r a y.j o i n()
这个⽅法可以使⽤不同的符号连接成字符串,默认不传参数使⽤逗号(,)进⾏连接
l e t a r r a y=[10,20,30,40,50,60];
l e t a r r a y1=a r r a y.j o i n('-');
l e t a r r a y2=a r r a y.j o i n('|');
l e t a r r a y3=a r r a y.j o i n g();
c o n s o l e.l o g(a r r a y1);//10-20-30-40-50-60
c o n s o l e.l o g(a r r a y2);//10|20|30|40|50|60
c o n s o l e.l o g(a r r a y3);//10,20,30,40,50,60
位置⽅法
A r r a y.i n d e x O f(s e a r c h E l e m e n t,f r o m I n d e x):从数组的开头(位置0)开始向后查,没有到返回-1
A r r a y.l a s t I n d e x O f(s e a r c h E l e m e n g t,f r o m I n d e x):从数组的末尾开始向前查,没有到返回-1
s e a r c h E l e m e n t:需要查的元素
f r o m I n d e x:表⽰从什么位置开始查
//索引0,1,2,3,4,5,6,7,8