一、特点
1.数组元素可以是任意类型,并且同一个数组中的不同元素也可能有不同的类型。
2.数组最大能容纳4 294 967 295(2的32次方-1)个元素(索引是基于0的32位数值)。
3.js数组是动态的,无须声明一个固定大小的数组,或者在数组大小变化时无须重新分配空间。
4.数组元素的索引可以不连续,称为稀疏数组,稀疏数组的length为最大索引值+1。
5.稀疏数组
var a1=new Array(3);//该数组没有元素
var a2=[,,,];//该数组没有元素
var a3=[1,,3];//该数组为[1,empty,3],只有两个元素,length为3,是稀疏数组
6.length
设置length属性为一个小于当前长度的非负整数n时,当前数组中那些索引值大于或等于n的元素将从中删除。
var a=[1,2,3,4,5];
a.length=3;
console.log(a);//=>[1,2,3]
length属性值设置为大于其当前的长度,不会向数组中添加新元素,这是在数组尾部创建一个空区域。
二、数组方法——ECMAScript3
1.join():数组转字符串
将数组中所有元素都转化为字符串并连接在一起,返回生成的字符串。可指定一个可选的分隔符,默认使用逗号。
var a=[1,2,3];
a.join();//=>"1,2,3"
a.join("-");//=>"1-2-3"
2.split():字符串转数组
将字符串按照分隔符分割成若干块来创建一个数组。
var str="1-2-3";
var a=str.split("-");//=>a=[1,2,3]
3.reverse():排序
将数组中的元素颠倒顺序,返回逆序的数组。修改了原先的数组。
var a=[1,2,3];
a.reverse();//=>a=[3,2,1]
4.sort():排序
将数组中的元素排序并返回排序后的数组。当不带参数调用sort()时,数组元素以字母表顺序排序。如果数组包含undefined元素,会被排到数组的尾部。
var a=new Array("banana","cherry","apple");
a.sort();//=>a=["apple","banana","cherry"];
按照其他方式排序,必须给sort()方法传递一个比较函数。
(1)第一个参数应该在前,比较函数返回小于0的值;
(2)第一个参数应该在后,比较函数返回大于0的值;
(3)两个值相等(顺序无关紧要),比较函数返回0。
例如,用数值大小进行数组排序,
var a=[33,4,1111,222];
a.sort(function(a,b){return a-b;});//=>a=[4,33,222,1111]
5.slice():获取子数组
返回指定数组的一个片段或子数组。两个参数指定开始和结束的位置。返回的片段包含第一个参数但不包含第二个参数。参数出现负数-n,表示从数组末尾位置开始算第n个位置。如果没有指定该参数,那么切分的数组包含从开始到数组结束的所有元素.
var a=[1,2,3,4,5];
a.slice(0,3);//返回[1,2,3]
a.slice(1,-1);//返回[2,3,4]
a.slice(0);//返回[1,2,3,4,5]
6.concat():数组添加元素
创建并返回一个新数组,新数组的元素包括调用concat()的原始数组和方法中的每个参数。
var a=[1,2,3];
a.concat(4,5);//=>新数组[1,2,3,4,5]
a.concat([4,5]);//=>新数组[1,2,3,4,5]
a.concat(4,[5,6]);//=>新数组[1,2,3,4,[5,6]]
7.splice():数组添加/删除元素
是在数组中插入或删除元素的通用方法。修改调用的数组并返回由删除元素组成的数组,如果没有删除元素就返回空数组。
- 仅有两个参数时,第一个参数为删除的起始元素,第二个参数为删除元素的个数。
- 大于两个参数且第二个参数为0时,第一个参数为插入元素的起始位置,第三个及之后的元素为要插入数组的元素。
- 大于两个参数且第二个参数不为0时,第一个参数为插入元素的起始位置也是删除元素的起始位置,第二个元素为删除元素的个数,第三个及之后的元素为要插入数组的元素。
var a=[1,2,3,4,5];
a.splice(2,0,'a','b');//返回[],a=[1,2,'a','b',3,4,5]
a.splice(2,2,'c','d','e');//返回['a','b'],a=[1,2,'c','d','e',3,4,5]
8.push()和pop():数组添加/删除元素
push()方法在数组的尾部添加一个或多个元素,并返回数组新的长度。
pop()方法删除数组最后一个元素,减小数组长度并返回它删除的值。
两个方法都修改原数组。
var stack=[];
stack.push(1,2);//stack=[1,2],返回2(数组长度)
stack.pop();//stack=[1],返回2(删除的最后一个元素的值)
9.unshift()和shift():数组添加/删除元素
unshift()方法在数组的头部添加一个或多个元素,并返回数组新的长度。
shift()方法删除数组第一个元素,减小数组长度并返回它删除的值。
var a=[];
a.unshift(1,[2,3]);//a=[1,[2,3]],返回2(数组长度)
a.shift();//a=[[1,2]],返回1(删除的第一个元素的值)
10.toString()和toLocaleString()
toString()方法将数组每个元素转化为字符串,并且输出用逗号分隔的字符串列表。注意,输出不包括方括号或其他任何形式的包裹数组值的分隔符。与不使用任何参数调用join()方法返回的字符串一样。
[1,[2,'c']].toString();//=>"1,2,c"
toLocaleString()是toString()方法的本地化版本。调用元素的这个方法将每个数组元素转化为字符串,并且使用本地化分隔符将这些字符串连接起来生成最终的字符串。
三、数组方法——ECMAScript5
1.forEach():遍历
遍历数组,为每个元素调用指定的函数。修改原数组。注意,forEach()没有break来提前终止循环。为提前终止循环必须把forEach()方法放在一个try块中,并能抛出一个异常。
var data=[1,2,3,4,5];
data.forEach(function(value,index,array){//三个参数为每个元素值、索引、该数组
array[index]=value+1;
});
console.log(data);//=>[2,3,4,5,6]
2.map():遍历
将调用的数组的每个元素传递给指定的函数,并返回一个新数组。
var a=[1,2,3];
var b=a.map(function(x){
return x*x;
});//=>b=[1,4,9]
3.filter:获得子数组
该方法返回的数组元素是调用的数组的一个子集。传递的参数为一个用来逻辑判定的函数,该函数返回true或false,当返回true时,当前元素就是这个子集的成员,它将被添加到一个作为返回值的数组中。该方法返回的数组总是稠密的。
var a=[5,4,3,2,1];
var b=a.filter(function(x){
return x<3;
});//=>b=[2,1]
4.every()和some():逻辑判定
(1)every()——“所有”,当且仅当数组中的所有元素调用判定函数都返回true,它才返回true。
var a=[1,2,3,4,5];
a.every(function(x){ return x<10; });//=>true:数组中所有的值都小于10
a.every(function(x){ return x%2===0; });//=>false:不是所有元素都是偶数
(2)some()——“存在”,数组中只要有一个元素调用判定函数返回true,它就返回true;当且仅当数组中所有元素调用判定函数都返回false,它才返回false。
var a=[1,2,3,4,5];
a.some(function(x){ return x%2===0; })//=>true:a中存在元素为偶数
a.some(isNaN);//=>false:a不包含非数值元素
注意,这两个函数一旦确定返回什么值就会停止遍历数组元素。
5.reduce()和reduceRight():组合化简
使用指定的函数将数组元素进行组合,生成单个值并返回。
reduce()有两个参数,第一个参数为执行化简操作的函数,第二个参数为返回值的初始值,当没有第二个参数时,默认初始值为数组的第一个元素。
reduceRight()基本同reduce()的用法一样,但reduceRight()是从数组索引的高位向低位遍历。
例如,接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
var numbers = [65, 44, 12, 4];
function getSum(total, num) {
return total + num;
}
function myFunction(item) {
document.getElementById("demo").innerHTML = numbers.reduce(getSum);
}
6.indexOf()和lastIndexOf()
搜索整个数组中具有给定值的元素,返回找到的第一个元素的索引,如果没有找到就返回-1。接收参数:第一个参数是需要搜索的值;第二个参数可选,指定数组中的一个索引,并从那里开始搜索(该值为负数,代表对数组末尾的偏移量)。
indexOf()从头至尾搜索;lastIndexOf()从尾至首搜索。
var a=[0,1,2,1,0];
a.indexOf(1);//=>1
a.lastIndexOf(1);//=>3
a.indexOf(3);//=>-1
四、判断数组类型isArray()
给定一个未知对象,判定它是否为数组。例如,
var a=[1,2,3];
Array.isArray(a);//=>true
五、类数组对象
(1)形如a={0: 0, 1: 1, 2: 4, 3: 9,length:4}
的对象,属性为非负整数。类数组对象不能直接调用数组方法,但可以像数组那样for循环遍历对象属性。
var a={0: 0, 1: 1, 2: 4, 3: 9,length:4};
var total=0;
for(var i=0;i<a.length;i++)
total+=a[i];
console.log(total);//=>14
(2)一些DOM方法也返回类数组对象,如document.getElementByTagName()
(3)检测是否为类数组对象
function isArrayLike(o){
if( o && //o不是null、undefined等
typeof o==="object" && //o是对象
isFinite(o.length) && //o.length是有限数值
o.length>0 && //o.length为非负值
o.length===Math.floor(o.length) && //o.length是整数
o.length<4294967296 //o.length<2的32次方
)
return true; //o是类数组对象
else
return false; //否则不是类数组对象
}
六、作为数组的字符串
将字符串作为数组看待,调用call使得通用的数组方法可以应用到字符串上。注意,字符串是不可变值,因此一些数组方法无效。
var s="Javascript";
Array.prototype.join.call(s," ");//=>"J a v a s c r i p t"
——阅读《Javascript权威指南》第七章