0.注意事项
javascript的数组的应用是非常广泛的,数组是一种经过优化的类,巧妙地使用数组,可以使程序效率翻倍的提升,学习数组,需要特别注意以下几点:
1.数组是没有类型的:例如var a = [1,'123',object,{},[],false],这种无下限,无节操的特点,使得创建多维数组,对象数组有了可能。
2.数组的索引值是从0~232-2的数值,这是数组所能容纳的最大容量,其实如果不是故意找麻烦,数组的长度足够用了。
3.javascript的数组是动态的,你完全没有必要在声明数组的时候指定其长度,即使指定了也没啥意义,如var array = new Array(10);当其真实数据超过10个时,会动态分配空间
4javascript数组的索引不一定是连续的,例如稀疏数组(基本上不用考虑,很少使用)
5.从宏观上来看,数组也是一个对象,其下标值跟一个常规对象的属性是非常类似的,我们经常使用user.name来访问一个类的属性,数组我们使用array[1]来访问,其实使用user[name]访问属性也可以,数组继承自Array.prototype中的属性,其含有很多有用的函数,这些方法同样适用于类数组对象,特别是对于字符串,使用数组的方式,有时会特别简单(后面会专门讨论)
1.数组的创建
数组的创建有两种方式(1)var array = []; (2)var array = new Array();第一种方式比第二种方式要清晰方便的多,所以建议使用第一种。
1 var array = [];
2 var array = [1,3,2,[1,2],object,'abc',true,{}];
3 var array = [,,,];//由于数字可以设置末尾有可选的“,”此表示两个undefined
2.数组元素的访问及与常规类的差异
前面提到数组可以通过new Array()来创建,继承了Array.prototype中的属性,可知数组其实就是一个类,其访问属性的方式都可以是obj[arr]的形式,把数组的下表数字转化为字符‘1’,‘2’...后,完全可以看成就是一个常规类,数组和常规类最大的不同时数组有一个length属性,当我们给一个非负整数赋值(范围内),length属性会自动的更改,如果是范围外的或字符串等,将视为数组的属性,这样我们在访问数组或对象时永远也不会有越界的错误,最多是undefined。
var o = [];
o[1] = 'aaaa';//length为2
o[1.23] = 'bbbb'//length不变,a有了一个‘1.23’的属性
a['100'] = 'vvvv';//表示在100这个位置添加了一个 元素,length为101
3.数组的增删改查
增删改查是我们程序员的基本功,熟练掌握数组的增删改查是必要的,数组的访问和修改一般按照常规的array[i]的形式进行,此处重点说明增加和删除操作,以及查询的一些小技巧。
1.增加和删除:
//添加1
var a = [];
a[0]=0,a[1] = 1;//最基础的方式
//添加2,使用push方法
a.push('one','two',);//可以多个参数,在数组末尾添加值,并返回新的数组长度
//删除1
a.pop();//与push方法相对应的,移除数组末尾的一个值,没有参数,返回移除的元素。这两个方法都是在原数组上进行改动,可以实现数组的栈形式
a = [1,2,3,4,5,6];
delete a[1];//表示在1这个位置的数据被删除掉
1 in a //false
//与pop()和push()对用的方法,shift()和unshift()方法
a = [];
a.unshift(1);//a:[1] 返回1
a.unshift(2,3);//a:[2,3,1] 返回3,可以看到多个参数的不同
a.shift();//a:[3,1] 返回2
//splice 方法可以完成插入删除或两者兼顾
var a = [1,2,3,4,5,6,7];
a.splice(1,2,'a','b')//返回[1,'a','b',4,5,6] 第一个参数表示删除或者插入的起始位置,第二个参数表示要删除的个数,其余的参数都是要此位置插入的数据
2.数组遍历
使用for循环是遍历数组最好的方式
var keys = object.keys(o);
var values = [];
for(var i =0; i < keys.length; i++){
var key = keys[i];
values[i] = key;
}
4.数组中常用到的一些方法
ECMAScript3中常用方法。
1.join(),将数组的所有元素转化为字符串并联在一起,并返回字符串。
var a = [1,2,3,4];
a.join();//返回'1,2,3,4'
a.join(" ");//返回'1 2 3 4 '
a.join('-');//'1-2-3-4'
2.reverse(),数组元素循序变换,返回逆序数组
var a = [1,2,3];
a.reverse();
var s = a.join(-);//s:'3-2-1'
3.sort(),排序并返回排序后的数组
//默认按字母顺序排序,undefined排到最后,我们亦可以自定义排序
var a = [1,22,111,3];
a.sort(function(a,b){//此处使用匿名函数,没必要起名字
return a-b;//如果小于0,a在前,小于0,b在前
});
4.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,7]]);//[1,2,3,4,5,[6,7]]
5.slice()数组截取。第一个参数表示开始位置,第二个表示结束位置,第二个参数可以省略
var a = [1,2,3,4,5];
a.slice(0,3);//[1,2,3]
a.slice(3);//[4,5]
a.slice(1,-1);//[2,3,4]
a.slice(-3,-2)//[3]
6.splice ()略
7.push() pop()略
8.unshift() shift()略
9.toString()//与join()方法类似
ECMAScript5中的9个方法
(ECMAScript5大多数方法有两个参数,第一个是一个函数,第二个是可选的)
1.forEach(),遍历数组。略
2.map(),相当于生成一个一一对应的新数组
a = [1,2,3];
b = a.map(function(v){return v*v});//返回[1,4,9]
3.filter()通过一定的逻辑找出找的数据
a=[1,2,3,4,5];
a.filter(function(x){
return x < 3;//小于3的x
});//返回[1,2]
//常用于压缩数组
var b = a.filter(function(x){return ture});
var c = a.filter(function(x){
return x!=undefined && x!=null;
});
4.every() some()返回true和false ,用法与filter相似
5.indexOf() lastIndexOf()给定一个值,搜素整个数组,找到其下标值,否则返回-1
6.reduce() reduceRight() 指定函数对数组元素进行组合
var a = [1,2,3,4,5];
//求和
var sum = a.reduce(function(){
return x+y;
},0);