黑铁时代
Programing is not only one kind of technology, but also one kind of art.

Array类型就是我们经常使用的数组,JS中的数组比其他语言的更加强大,JS数组可以在同一个数组中保存不同类型的值,而且还可以任意改变它的长度等,下面我们就具体来看数组的使用方法。

 

初始化一个数组的两种方式:

1.构造函数方式:var nums = new Array(10); 或者 var nums = new Array(1,2,3,4,'5');

  第一个事例表示创建一个长度是10的数组,每一个数组项都是“undefined”。第二个事例表示创建了一个长度为5的数组,并且通过向构造函数传入参数就已经初始化了这个数组,数组项包含数字1,2,3,4和字符串“5”。如果你在一个实例中传入的是字符串“10”,那么就创建一个长度为1的数组,起数组项为字符串“10”。

2.字面量方式:var nums = [1,2,3,4,'5']; 这种方式同样也可以创建一个数组对象,其数组项为数字1,2,3,4和字符串“5”,长度为5。var nums = []; 表示创建一个空数组,长度为0。

 

我们操作数据可以通过数字下标来读取和赋值数组项,length属性表示数组的长度。比如var nums = [1,2,3,4,'5'];中,nums.length为5,nums[0]就表示数组的第一个项的值即1,nums[5]就表示第四个即“5”,因为数组都是从下标0开始的。也可以通过这种方式为数组项赋值,如nums[0] = 0;,那么nums就变成了[0,2,3,4,"5"];如果我们赋值的下标超出了数据长度,比如我赋值nums[6] = 7;,那么数组nums就变成了[1234"5"undefined7],长度length为7。即当我们赋值的下标超过数组长度时候,数组的长度会被改变,新增的每一项就会被初始化为“undefined”。我们还可以操作length来改变数组的长度,如果我们将nums.length设置成1,那么nums就变成了[1],因为数组的长度变成1了,就只会保留1的长度,其他的数组项将被删除。如果将length设置为10,那么nums将会在末尾增加5个数数组项,将数组长度撑到10,每个数组项的值都是“undefined”,即[1234"5"undefinedundefinedundefinedundefinedundefined]。

 

下面我们来看哈数组常用的方法:

toString:先调用每一个数组项toString方法,然后将这些转换后的结果用逗号分隔拼成一个字符串,即“1,2,3,4,5”;

valueOf:先调用每一个数组项的valueOf方法,然后返回数组的对象表示方法,即[1234"5"];

join:和toString不同的是,你可以传入一个字符串作为参数,然后数组项以这个字符串作为分隔符拼成一个字符串,如nums.join('#');会返回“1#2#3#4#5";

push:接受任意数量的参数,然后将它们一次推入到数组的末尾,就是常说的入栈操作,返回新数组的长度。nums.push(8,9,10)得到[1234"5"89,];

pop:将数组最后一个数组项删除,即出栈操作,并返回这个被出栈的数组项。nums.pop()得到[1234];

unshift:将新的数据项添加到数组前端而不是末尾,即入队操作,nums.unshift(8,9)得到[891234"5"],并返回新的数组的长度值;

shift:将数组最前端的数组项删除,并返回它,即出队操作,nums.shift()得到[234"5"];

reverse:反转数组,如nums.reverse()返回["5"4321],这个方法也会改变原数组,并返回改变后的原数组;

sort:默认的是升序排序,sort方法会将调用每个数组项的toString方法,然后再将字符串进行升序排序,注意是将字符串进行升序排序,比如“15”会在“5”之前。sort方法还可以接受一个函数作为参数,这个函数叫比较函数,它可以决定排序的方式,是按升序或者降序排列。这个函数需要传入两个参数,即相互比较的两个字符串。如果你想将第一个参数放在第二个参数之前,那么返回一个负数,反之则返回正数,返回0即表示相对位置不变。注意sort方法会改变原数组并将其返回。

  例:

  nums.sort( function ( value1, value2 ) {

    return value2 - value1;

  } );

   // 如果value2大于value1,就返回正数,value2就会放在value1前面,如果value2小于value1就会放到后面,即会按照降序排序。用value1-value2的话sort函数就会按照升序排列。

concat:接受任意的参数,如果参数是数组,就将数组项一次连接到原数组的末尾,如果不是数据,就直接作为一个新的数组项添加到末尾。例如:var s = [1,2,3]; s.concat(4, [5,6]); 返回[1,2,3,4,5,6];此方法不会改变原数组,而是返回一个新的数组。

slice:接受两个参数,分别是起始位置和结束位置。例如:var nums = [0,1,2,3,4,5]; nums.slice(1,3); 将返回[1,2],从下标为1的位置到下标为3的位置结束。此方法也不会改变原有数组。如果参数为负数,那么将数组的length加上这个负数再作计算。如果结束位置小于起始位置,无论正负,都返回[]。

splice:这个方法非常强大,它的前两个参数是必须的,第一个参数是下标位置,第二个参数表示从第一个参数表示的下标位置开始要删除的数组项个数,如果有第三个参数,那么就将这个参数插入到开始删除的位置即第一个参数表示的下标位置,如果还有第四个,第五个参数,那么就依次插入进去,然后返回一个数组包含被删除的数组项,而且这个方法会改变原数组。因此,这个方法可以实现三个功能:

  1.如果只有前面两个参数,那么就等于删除数组中的不要的数组项,如果你指定第二个参数为0,那么在这种情况下,没有什么意义;

  2.如果带三个或三个以上的参数,如果指定第二个参数是0,那么就不删除任何数组项,并且在指定位置插入新的数组项,相当于插入新数组项的功能;

  3.在第二种描述的插入功能中,如果第二个参数不是0,那么不仅会从指定位置开始删除指定数量的数组项,还会在指定位置插入指定的新的数组项;

 

总结一下数组的方法:

  push,pop,shift,unshift,reverse,sort,splice都会改变原数组;

  slice,concat不会改变原数组,都是返回一个新的数组;

 

其实数组也是js中的一个对象,所以如果这样操作一个数组:nums['index'] = 1; 你也可以通过for-in这种枚举的迭代方式取出这个下标的值,但实际上index应该是数组对象的一个属性,具有数字下标的数组项才会作为数组的数组项。数组对象是属于引用类型的,它是被存放在堆内存中的,在多个变量中传递的时候属于共享传递,即你通过其中一个变量改变数组,其他所有引用这个数组的变量也会反映出同样的改变,因为它们共享同一个数组对象。

 

  

 

 

 

 

 

posted on 2012-06-25 23:18  黑铁时代  阅读(241)  评论(0)    收藏  举报