在js中,数组是一种及其常用的类型,在学习js高级程序设计这本书的过程中受益匪浅,此处将其总结归纳,以备将来使用。
js的Array与很多强类型的编程语言不同,js的数组并不是只能保存一种类型的数据,数组的每一项均可以保存任意类型的对象,你如果在第一项保存一个String类型的数据,在第二项上并不是只能保存String类型的数据,你可以保存任意类型的数据,如Number类型的数据,这是与强类型语言数组类型的最大区别。
eg:var array = new Array();
在使用new关键字构造数组时,并不需要为其指定长度(与java中的List类型相似),当然,如果你已经可以确定数组的确切长度,也可以在构造函数中传入一个数字指定数组的长度,如创建一个长度为5的数组:
eg:var array = new Array(5);
如果你想在创建数组的同时初始化这个数组,则可以在构造函数中传入你想保存在数组中的值直接进行初始化,如你想创建一个包含“green”、“blue”和“red”三个项的数组,
eg:var array = new Array("green","blue","red");
注:在使用new关键字进行数组的构造时,new关键字其实可以省略,并不推荐此种用法,影响可读性。
个人理解的数组字面量其实就是一个数组形式的对象,使用数组字面量来构造数组其实就是用一个数组形式的对象直接赋值给声明的数组变量名:
eg:var array = [];
这样,你也可以创建一个空数组,和使用new关键字的效果相同,当然你也可以在声明数组的同时直接进行初始化,
eg:var array = ["green","blue","red"];
数组创建出来后在不同的环境中会有不同的用法,此处针对集中及其常用的方法做简要介绍。
上文已经提及,在js中的数组与java中的list更为相似,其长度是可变的,即是你在初始化时显示指定了数组的长度,但这丝毫不影响其长度可变的性质。如你的数组显示指定了长度为5或者你的数组中有5个数据项,但是这并不会意味着你不能访问第6个数据项。
eg:var array = new Array("green","blue","red");
alert(array[3]);
上面的代码并不会向java语言一样报“下标越界异常”等类似的错误,它同样可以获取到该位置的值,只不过这个位置上的值是undefined而已。通过这个方法,我们可以直接使用来为数组添加值。
eg:var length = array.length();
varray[length] = "black";
这样就成果的在数组中追加了数据项。
数组的这个方法来源于栈这一数据结构的方法,栈的特性就是先进后出,其中入栈的方法就是push方法,数组同样可以使用这一方法来向数组中添加一个数据项,新添加的数据会追加到数组的尾部并返回该项的索引。
eg:var array = new Array("green","blue","red");
var index = array.push("black");//在数组的尾部追加一个数据项
这个方法来自队列,它可以实现从数组的前部添加一个数据项。
eg:var array = new Array("green","blue","red");
splice方法是一个非常强大的方法,它可以实现从数组的任意位置删除/添加任意数量的数据项。它包含三个参数:
参数1:位置index,即要操作的起始位置
参数2:要删除的项数,即你想从起始位置删除多少项数据
参数3:要添加的数据项(可以有多项),如果添加的数据项不止一项,则这个方法可以接受不止三个参数,从第三项开始的参数都是要添加到数组中的数据项;如果没有要添加的数据项,则可以只传递两个参数。
eg:array = array.splice(0,2);//从位置0开始删除两项
array = array.splice(2,0,'white','purple');//在位置2依次插入white和purple两项
array = array.splice(2,1,'white','purple');//在位置2上先删除一项再插入两项,即替换
js中数组的length属性是及其“有个性”的,之所以这样说是因为js中数组的length属性并不是只读的,也就是说我们可以手动修改这个属性的值,例如现在有一个length=5的数组,如果我们想删除最后一项,很简单,直接修改length=4即可。
pop方法与前文push方法相对应,push方法可以从数组的末尾移除一项数据项并返回该项。
eg:var data = array.pop();
与前文的unshift方法对应,它可以移除并返回数组的第一项。
eg:var data = array.shift();
将数组转换为字符串也很常用
数组的toString方法会返回数组中每个值的字符串形式拼接而成的以逗号连接的字符串(这个方法会调用数组中每一项的toString方法)。
eg:var array = new Array("green","blue","red");
array.toString(); //"green,blue,red"
toString方法总是返回以“,”连接的字符串,使用join方法则可以使用其它符号进行连接。
eg:array.join("|");//"green|blue|red"
这个可能是我们使用的比较多的方法,此处不解释。
顾名思义,此方法是将数组逆序,不再赘述。
此方法默认情况下是按照数组中数据项的字符串形式的升序排序,切记是按照数据项的字符串形式的升序排序。
eg:var array = new Array(1,2,5,15,10);
array.sort();//1,10,15,2,5
如果想要按照我们自己的意愿来进行排序,则需要传入一个自定义比较器compare。
//升序排序
eg:function compare(value1,value2){
return value1 - value2;//如果value1>value2,则返回正数,反之则为负数或者0;
}
array.sort(compare);//1,2,5,10,15
//降序排序
eg:function compare(value1,value2){
return value2 - value1;//如果value1>value2,则返回正数,反之则为负数或者0;
}
array.sort(compare);//15,10,5,2,1
concat方法可以接受多个参数用于将多个数组或数据项进行拼接,首先基于当前数组创建一个新的数组及当前数组的副本,然后将传入的数组或数据项参数拼接到副本数组的末尾并将其返回,如果没有传入数组或者传入的是空数组,则相当于创建了一个当前数组的副本。
eg:var arr = new Array(''a","b");
var newArr = arr.concat("c",["d","e"]);//[''a'',''b'',''c'',''d'',''e'']
slice方法用于从已有数组中切割出一个新的数组并将其返回,此方法不影响原数组。
eg:var arr = [''a'',''b'',''c'',''d'',''e''];
var newArr = arr.slice(1,4);//从位置1(含)开始到位置4(不含)结束,含头不含尾["b'',''c'',''d'']
此方法用于从指定位置删除、插入项,也是一种变相的切割/连接,详见上文
获取指定项索引是及其常见的场景,最常用的方法是indexOf方法和lastIndexOf方法,二者的区别是前者从前往后找(第一项的索引为0),后者从后往前查找(最后一项的索引为0)。这两个方法都可以接受两个参数,参数一是要查找的数据项,参数二是指定开始查找的起始索引位置(可选)。
eg:var numbers = [1,2,3,4,5,6,7,8,9];
var index = numbers.indexOf(4);//3
var reverseIndex = numbers.lastIndexOf(4);//5
此处介绍几个较为常用和使用的迭代方法(不包含使用最普遍的for循环)
对数组中的每一项运行其参数指定的方法,使用场景是需要将数组中的每一项都带入到另一个场景中,此方法并没有返回值,一般不用于自身的改变。
eg:var numbers = [1,2,3,4,5,6,7,8,9];
numbers.forEach(function(item,index,array){
doSomething(item);//将每一项带入到其他场景中
});
map方法则返回一个数组,常常用于对数组自身的改变。
eg:var numbers = [1,2,3,4,5,6,7,8,9];
var newNumbers = numbers.map(function(item,index,array){//用于对数组中的每一项均加2
return (item+2);
});
此方法可以用于对数组进行相应的筛选,他会对数组中的每一项运行参数给定的函数,返回该函数返回true的项组成的数组
eg:var numbers = [1,2,3,4,5,6,7,8,9];
var number = numbers.filter(function(item,index,array){//返回原数组中所有大于2的项组成的新数组
return (item>2);
});
这两个方法均用于判定数组是否满足某种条件,前者是只要数组中只要有一个数据项满足条件则认为数组满足条件;后者则要求数组中的所有数组项均满足该要求才认定该数组满足要求。
eg:var numbers = [1,2,3,4,5,6,7,8,9];
var flag = numbers.every(function(item,index,array){//数组是否每一项均大于2,false
return (item>2);
});
eg:var numbers = [1,2,3,4,5,6,7,8,9];
var flag = numbers.every(function(item,index,array){//数组中是否有大于2的项,true
return (item>2);
});
本人的第一篇博客,暂时写到这里,有好的总结再汇总,欢迎大家批评指正。