数组是零索引(第一个值的索引为0),一组数值的有序序列。数组是对一组同一类型的(例如String)相关对象的便利存储,但现实中,一个数组中可以包含多种类型的对象,包含其他数组。
创建一个数组,有两种方法:使用对象构造器,或者是直接声明,为变量分配一组数值。
使用对象构造器定义数组:
- var myArray1 = new Array("你好","极客","标签");
直接声明:
- var myArray2 = ["你好","极客","标签"];
通常我们更愿意使用直接声明,更多信息参见谷歌代码指南。
如果数组的值是不确定的,你可以先定义一个空的数组,然后用方法或者是使用索引添加子元素。
- // 创建空的数据
- var myArray = [];
- // 在索引0中添加“你好”
- myArray.push("你好");
- // 在索引1处添加“极客”
- myArray.push("极客");
- // 在索引2处添加“标签”
- myArray[2] = "标签";
.push()方法将元素加入到数组的最末。你可以用索引直接添加元素,没有声明的索引项是undefined。例如下面这个例子中:
- var myArray = [];
- myArray[ 0 ] = "你好";
- myArray[ 1 ] = "极客";
- myArray[ 3 ] = "标签";
- console.log( myArray ); // [ "你好", "极客", undefined, "标签" ];
如果数组的大小是未知的,.push()用起来更加安全一些。对元素的赋值和取值都可以用索引。如下例所示:
- var myArray = ["你好","极客","标签"];
- console.log(myArray[2]); // "标签"
数组方法和属性
.length
.length属性定义了一个数组中有多少元素,通常用于循环遍历中,除了在for/in循环中,在for/in循环中,不需要用数组长度来指定遍历次数。
- var myArray = ["你好","极客","标签"];
- for (var i = 0; i < myArray.length; i++) {
- console.log( myArray[i] );
- }
.concat()
连接两个以上的数组。
- var myArray = [ 1, 2, 3 ];
- var myOtherArray = [ 5, 6, 7 ];
- var wholeArray = myArray.concat( myOtherArray ); // [ 1, 2, 3, 5, 6, 7 ]
.join()
.join()方法是返回一个字符串,字符串是将数组中元素连接起来,其中join()的传参是用作数组元素连接时的连接符,没有传参,则所有元素默认用逗号连接。
- // 连接元素
- var myArray = [ "你好", "极客", "标签" ];
-
- // 默认的连接分隔符是逗号
- console.log( myArray.join() ); // "你好,极客,标签"
-
- // 任何字符都可以作为连接分隔符
- console.log( myArray.join( " " ) ); // "你好 极客 标签";
- console.log( myArray.join( "!!" ) ); // "你好!!极客!!标签";
-
- // 也可以用空作为连接分隔符,那么元素间没有分隔符
- console.log( myArray.join( "" ) ); // "你好极客标签"
.pop()
.pop()与.push()的作用正好相反,将最后一个元素从数组中移除出来。
- var myArray = [];
-
- myArray.push( 0 ); // [ 0 ]
- myArray.push( 2 ); // [ 0 , 2 ]
- myArray.push( 7 ); // [ 0 , 2 , 7 ]
- myArray.pop(); // [ 0 , 2 ]
.reverse()
该方法将数组中的元素逆序排列。
- var myArray = [ "你好", "极客", "标签" ];
- myArray.reverse(); // [ "标签", "极客", "你好" ]
.shift()
移除数组中的第一个元素。利用.push()和.shift(),你可以创建先进先出队列。
- // shift(),push()创建队列
-
- var myArray = [];
-
- myArray.push( 0 ); // [ 0 ]
- myArray.push( 2 ); // [ 0 , 2 ]
- myArray.push( 7 ); // [ 0 , 2 , 7 ]
- myArray.shift(); // [ 2 , 7 ]
.slice()
提取原有数组中的一部分放入新的数组。此方法只有一个参数,既开始的索引。
- // 切割
- var myArray = [ 1, 2, 3, 4, 5, 6, 7, 8 ];
- var newArray = myArray.slice( 4 );
-
- console.log( myArray ); // [ 1, 2, 3, 4, 5, 6, 7, 8 ]
- console.log( newArray ); // [ 5, 6, 7, 8 ]
.splice()
移除一定数量的元素,并且在指定位置插入新的元素。该方法需要至少3个参数:
- myArray.splice( index, length, values, ... );
- index - 指定插入移除的索引位置
- length - 需要移除的元素个数
- values - 要插入到指定索引位置的元素值
示例:
- var myArray = [ 0, 7, 8, 5 ];
- myArray.splice( 1, 2, 1, 2, 3, 4 );
- console.log( myArray ); // [ 0, 1, 2, 3, 4, 5 ]
.sort()
对数组进行排序,只需要一个参数,即指定一个比较的方法。如果没有指定比较方法,则默认按照升序排序。
- // 不指定比较方法的排序,默认按照升序排列
- var myArray = [ 3, 4, 6, 1 ];
- myArray.sort(); // 1, 3, 4, 6
-
- // 用比较方法进行逆序排列
- function descending( a, b ) {
- return b - a;
- }
- var myArray = [ 3, 4, 6, 1 ];
- myArray.sort( descending ); // [ 6, 4, 3, 1 ]
在上例中,descending方法的返回值很重要。如果返回值小于0,那么a的索引排在b的索引前面,反之,大于0,b排在a前面。如果返回值等于0,两个元素的索引相等。
.unshift()
在数组的最前端插入元素。
- var myArray = [];
- myArray.unshift( 0 ); // [ 0 ]
- myArray.unshift( 2 ); // [ 2 , 0 ]
- myArray.unshift( 7 ); // [ 7 , 2 , 0 ]
.forEach()
现在浏览器大多支持用.forEach()方法遍历数组,你可以用forEach方法对每一个数组中的元素进行同样的操作。
该方法最多需要3个参数:
- element - 元素本身
- index - 数组中元素的索引
- array - 数组本身
这三个参数都非必要参数,但是大多数情况下,你会需要至少用到element变量。
- // 本地 forEach()方法
- function printElement( elem ) {
- console.log( elem );
- }
-
- function printElementAndIndex( elem, index ) {
- console.log( "索引 " + index + ": " + elem );
- }
-
- function negateElement( elem, index, array ) {
- array[ index ] = -elem;
- }
- myArray = [ 1, 2, 3, 4, 5 ];
-
- // 打印所有的元素
- myArray.forEach( printElement );
-
- // 打印"索引 0: 1", "索引 1: 2", "索引 2: 3", ...
- myArray.forEach( printElementAndIndex );
-
- // myArray的元素取反: [ -1, -2, -3, -4, -5 ]
- myArray.forEach( negateElement );