数组的长度可变,元素类型可变。数组本身依旧是 Object 类型,对一个数组变量进行 typeof ,得到的字符串是 object。
定义
new Array 形式
有如下三种定义方式:
var a1 = new Array()
var a2 = new Array(3);
var a3 = new Array('fd',
function (arg) {
return 'run is array'
},
3,
{ name:'array element' }
); // 元素类型各不相同
alert(a1);
alert(a2); // 会输出两个逗号,表示一共有三个元素——各个元素通过逗号分隔
alert(a3);
-
虽然在第二种定义方式中指定了数组长度是 3 ,但数组的长度依旧可变。
var a = new Array(3); a[4]=function (arg) { return "run is a4"; }// 虽然数组在定义时指定了长度为 3 ,但这里依旧操作了下标为 4 的元素 alert(a[4]());
第三种方式不但创建了一个数组,而且向数组中存储了 4 个元素。
[] 形式
如下:
var a = []; // 创建一个空数组
a[1] = {}; // 通过下标形式为元素指定值
alert(a);
var a2 = ['name',10] // 创建一个数组,同时指定两个元素值
alert(a2);
length 属性
获取数组的长度。数组本身也是一个对象,所以对对象的任何操作方法都可以用于数组。由于 length 是数组中的一个属性,所以length 也可被赋值。
var a2 = ['name',10]
var a2 = ['name',10]
alert(a2.length);
a2[10] = 10;
alert(a2.length); // 11,因为上句为下标为 10 的元素赋值
var a3 =[];
a3.length = 20; // 为数组的 length 属性强制赋值。
alert(a3);
常用方法
push pop
使数组具备栈的功能。push 将元素添加到数组的末尾,pop 弹出末尾元素。push 返回修改后的数组长度,pop 返回末尾元素。
shift 与 unshift
- shift:移除数组中第一个元素,返回的是移除的元素值。与 push 结合,可以使数组具备队列功能。
2.unshift:向数组的最前端添加一个元素,返回的是修改后数组的长度。
排序
reverse() :将原数组逆序。
sort(function):根据指定的方法对数组中的元素进行排序。该方法结束后,原数组会变化。
连接与截取
concat():返回一个新数组,该数组中的元素为与 push 时一样。如果不传参数,相当于对原数组进行复制。
-
join:以参数为连接符,连接数组中各个元素,该方法并不会影响数组本身。默认是逗号。
var o = ['a','b']; alert(o); // a,b alert(o.join('-')); // a-b alert(o); ////输出的依旧 a,b
-
slice() : 截取数组的子串,并形成一个新数组返回。如果指定了两个参数,则含头不含尾。
var o = []; for(x = 0;x<10;x++){ o[x] = x; } alert(o.slice(2,5)); //2,3,4。参数中的2,5指的是截取原数组的起始、结束的下标。 alert(o); // 0 到 9
-
splice() :替换数组中指定位置的元素。根据参数的不同,它敢具备删除、添加功能。
var o = [1,2,3,4,5]; o.splice(2,1,'aa'); // 第二个参数指的是要操作的元素的长度,它不是结束下标。 alert(o);// 1,2,aa,4,5
上述代码,会从下标为 2 的元素开始(含),取出长度为 1 的元素,将这些元素替换 成 aa 。
因此,如果第二个参数为 0,就相当于向原数组中插入第三个元素;如果没有第三个元素,就相当于从原数组中删除前两个元素指定的块。
var o = [1,2,3,4,5]; o.splice(2,1); // 相当于删除了从下标 2 开始,长度为 1 的一块元素 alert(o);//1,2,4,5 o = [1,2,3,4,5]; o.splice(2,0,'a','b'); // 相当于从下标 2 开始,今次插入后面的元素。 alert(o);//1,2,a,b,3,4,5
元素操作
every():对数组中的每一个元素进行指定的函数操作。如果每一个元素都返回true,那么every方法返回true;否则返回false。
some():类似于every(),但只要有一个元素返回true,该方法就会返回true,否则返回false。
filter():过滤。遍历数组,对每一个元素执行指定的方法,并将函数返回为true的元素保留到新数组中,最后将新数组返回。
forEach():遍历。遍历数组,并对每一元素执行指定方法。无返回值,且不操作数组本身。
-
map():映射。遍历数组,并对每一个元素执行指定的方法,将方法返回值存储到新数组中,并且将新数组返回。
window.onload=function(){ var a =[4,5,66]; var result = a.map(function(value,index,array){ return value * 2; }); alert(result); }
map的参数便是指定的方法,它的参数是固定的。第一个指当前元素,第二个指元素的下标,第三个指元素所在的数组。
-
reduce()与reduceRight():遍历数组,只不过后面一个是从右往左遍历。其返回值为最后一个元素时方法的返回值。如:
window.onload=function(){ var a =[4,5,66]; var result = a.reduce(function(pre,cur,index,array){ log(pre+","+cur) return pre*2+cur; }); alert(result);//result = 92 result = a.reduceRight(function(pre,cur,index,array){ log(pre+","+cur) return pre*2+cur; }); alert(result);//result = 278 }
reduce()参数的格式固定。第一个参数为当前元素的上一次方法的返回值,第二个参数为当前元素,第三个为下标,第四个为数组。
- reduce(),第一次调用函数中 pre 为第一上元素。
- reduceRight(),第一次调用函数时,pre 为最后一次元素。
补充
Array 也属于 Object
因为 Array 也是 Object,所以下面的赋值方法也是可以的:
var a =[];
a['name']='name';
a['age']=18;
alert(a['name']+"----"+a[0]);// 最后输出的是 undefined
因为数组本身也是对象,所以第二、三句赋值时,将变量 a 按照对象进行处理,即:为变量 a 定义 name 与 age 两个属性,并分别赋值为 name 与 18。此时并没有为数组 a 定义元素,所以 a[0] 输出 undefined。
如果添加上下述代码:
a[0] = 'array';
alert(a['name']+"----"+a[0]);// 分别输出 name 与 array
alert(a.length); // 1
第一句中为 a 定义了一个元素,这并不影响 a 作为一个对象中已具有的属性(即 name 与 age)。所以输出时,分别输出了 name 与 array 两个值。
数组的属性并不算作 length,所以通过 length 输出时,结果依旧是 1。