在程序语言中数组的重要性不言而喻,JavaScript中数组也是最常使用的对象之一,数组是值的有序集合,由于弱类型的原因,JavaScript中数组十分灵活、强大,不像是Java等强类型高级语言数组只能存放同一类型或其子类型元素,JavaScript在同一个数组中可以存放多种类型的元素,而且是长度也是可以动态调整的,可以随着数据增加或减少自动对数组长度做更改。
1.创建数组
在Javascript可以使用多种方法创建数组:
通过构造函数
1.通过没有参数的构造函数,创建一个空数组。1
var arr=new Array();
2.一个数字参数构造函数,指定数组长度(数组长度可以动态调整),创建指定长度的数组。1
2var arr=new Array(3);
console.log(arr.length);//3
3.带有初始化数据的构造函数,创建数组并初始化参数数据。1
2var arr=new Array(3,5,9);
console.log(arr);//3,5,9
通过字面量
1.使用方括号,创建空数组,和通过没有参数的构造函数作用相同。1
var arr=[];
2.使用中括号,并传入初始化数据,等同于调用调用带有初始化数据的构造函数。1
var arr=[1,2,3];
注意点
1.在使用构造函数创建数组时如果传入一个数字参数,则会创建一个长度为参数的数组,如果传入多个,则创建一个数组,参数作为初始化数据加到数组中。但是使用字面量方式,无论传入几个参数,都会把参数当作初始化内容。
2.使用带初始化参数的方式创建数组的时候,最好最后不要带多余的”,”,在不同的浏览器下对此处理方式不一样,主要是低版本IE下面length属性为4,最后一个项为undefined。
3.虽然数组里面可以存放不同数据类型的值,但是推荐还是只存放一种类型数据。
2.数组的索引(下标)和长度
数组的值可以通过自然数索引访问进行读写操作,下标也可以是一个得出非负整数的变量或表达式。1
2var arr=[1,2,3,4];
console.log(arr[0]); //1
数组也是对象,我们可以使用索引的奥秘在于,数组会把索引值转换为对应字符串(1=>”1”)作为对象属性名1
2
3var arr=new Array(3,1,2);
console.log(2 in arr);//true
console.log(3 in arr);//false
索引特殊性在于数组会自动更新length属性,当然因为JavaScript语法规定数字不能作为变量名,所以我们不能显示使用array.1这样的格式。由此可见其实负数,甚至非数字”索引“都是允许的,只不过这些会变成数组的属性,而不是索引。
数组的索引可以不是连续的,访问索引不存在的元素的时候返回undefined。
3.如何清空一个数组
1.arr=[];//直接通过字面量
2.arr.length=0;//设置length属性为0
3.arr.splice(0,arr.length);//通过splice方法来删除
4.通过循环for或者while来遍历删除。
4.数组的常用方法push、pop
1.push();将一个项从数组的尾部推入数组。
返回值:数组的长度。1
2
3var arr=new Array(3,1,2);
arr.push(4);
console.log(arr);//3,1,2,4
2.pop();方法则正相反,将数组的最后一个项弹出,字面意思很形象。
返回值:被弹出的那个数据。1
2
3var arr=new Array(3,1,2);
arr.pop();
console.log(arr);//3,1
5.数组的常用方法unshift、shift
1.unshift();将一个项从数组的头部推入数组。
返回值:数组的长度。1
2
3var arr=new Array(3,1,2);
arr.unshift(4);
console.log(arr);//4,3,1,2
2.shift();将数组的第一个项弹出。
返回值:被弹出的那个数据。1
2
3var arr=new Array(3,1,2);
arr.shift();
console.log(arr);//1,2
6.数组的常用方法splice
这个是集删除、添加于一身的强大方法。参数自然就会比较多了,有三个参数。
1.开始索引
2.删除元素的个数
3.插入的新元素,可以写多个
返回值:如果删除元素的个数不为零,则返回被删除的数组。否则就返回空数组。
7.数组的常用方法join
作用是把数组元素(对象调用其toString()方法)使用参数作为连接符连接成一字符串。1
2
3var arr=new Array(1,2,3,4,5);
console.log(arr.join(',')); //1,2,3,4,5
console.log(arr.join(' ')); //1 2 3 4 5
8.数组的常用方法slice
slice比splice少了一个p,是片断,截取的意思。不要搞错混淆了。
slice(start,end);返回一个新的数组,从start开始到end位置(不包含end位置的项)。
如果end大于start的话,则返回空数组。1
2
3
4
5
6var arr=new Array(1,2,3,4,5);
console.log(arr); //[1, 2, 3, 4, 5]
console.log(arr.slice(1,2));//2
console.log(arr.slice(1,-1));//[2, 3, 4]
console.log(arr.slice(3,2));//[]
console.log(arr); //[1, 2, 3, 4, 5]
9.数组的常用方法concat
俗称的“连接猫”。
concat方法用于拼接数组,a.concat(b)返回一个a和b共同组成的新数组,同样不会修改任何一个原始数组,也不会递归连接数组内部数组。1
2
3
4
5var arr1=new Array(1,2,3,4,5);
var arr2=new Array(6,7,8);
console.log(arr1.concat(arr2));//[1, 2, 3, 4, 5, 6, 7, 8]
console.log(arr1);//[1, 2, 3, 4, 5]
console.log(arr2); //[6, 7, 8]
10.数组的常用方法reverse
方法用于将数组逆序,它会修改原数组并返回。
比如可以用在字符串的反序上面。1
str.split('').reverse().join('');
11.数组的常用方法sort
sort方法用于对数组进行排序,当没有参数的时候会按字母表升序排序,如果含有undefined会被排到最后面,对象元素则会调用其toString方法,如果想按照自己定义方式排序,可以传一个排序方法进去,很典型的策略模式,同样sort会改变原数组。
sort采用的排序方法是快递排序,两两对比,具体代码因为native code谁也看不到。
伪代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21两两对比-->从小到大
[112,21,451,45]
112,21 左边的大,就对调
[21,112,451,45]
112,451 左边的不大,不对调
[21,112,451,45]
451,45
[21,112,45,451]
21,112
[21,112,45,451]
112,45
[21,45,112,451]
112,451
[21,45,112,451]
21,45
[21,45,112,451]
45,112
[21,45,112,451]
112,451
[21,45,112,451]
over
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于 b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。
最后
了解了这些,感觉数组真的很了不得啊,即强大有灵活,但是在遍历元素,及获取元素位置等也有一定的不便,这些在ECMAScript5中已经得到解决,有了indexOf等新的方法,熟练使用可以让我们的JavaScript优雅而高效。