javascript数组
1.数组(Array)
- 数组也是一个对象
- 与普通对象功能类似,也是用来存储一些值,不同的是普通的对象使用字符串来做属性名,而数组是使用数字来作为索引操作元素。
- 索引:从0开始的整数
- 数组的存储性能要比普通对象的好,开发中一般使用数组来存储一些数据。
- 创建数组对象,
var arr = new Array();
- 向数组中添加元素,语法:数组名[索引]=值。
- 读取数组中的元素,语法:数组名[索引];如果读取不存在的索引,不会报错而是返回undefined。
- 获取数组长度,使用length。语法:数组名.length
对于连续的数组,使用length可以获取到数组的长度,也就是元素的个数。
对于非连续的数组,使用length会获取到最大索引值加一,所以尽量不要创建非连续的数组。 - length还能被修改,如果修改的length大于原长度,多出的地方就会空出来,路过修改的length小于原长度,那么多出的元素会被删除。
- 向数组的最后一个位置添加值。语法:数组名[数组名.length]=值。
- 数组中可以存储任何数据类型,包括对象函数。
2.数组字面量
使用字面量创建数组。语法:[];
var arr=[];
使用字面量创建数组时,可以同时指定数组元素。
var arr=[1,2,3,4,5,6,7];
使用构造函数创建数组时也可以同时指定数组元素。
var arr =new Array(1,2,3,4);
但是有个不同:创建时只指定一个值var arr =new Array(10);
这里代表创建一个数组,数组长度为10。
3.数组常用的几个方法
-
push():该方法可以向数组的末尾添加一个或多个元素,并且返回数组新的长度。
使用方法:将要添加的元素作为方法的参数传递,就能将这些元素添加到数组的末尾。var result=arr.push(1,2,3,4,"五");
result的值就是数组新长度。 -
pop():该方法可以删除数组的最后一个元素,并且返回删除元素的值。
使用方法:var arr=[1,2,3,4]; var result=arr.pop();
result等于4。 -
unshift():该方法向数组的开头添加一个或多个元素,并且放回数组的新长度。
使用方法:arr.unshift(4,5,6);
元素插入后,其他的元素的索引会自动调整。 -
shift():该方法可以删除数组开头的第一个元素,并且返回被删除的元素。
使用方法:var arr=[1,2,3,4]; var result=arr.shift();
result值为1。 -
slice():该方法可以用来提取指定元素;其不会影响原数组,只是将截取到的元素封装到一个新数组中返回
有两个参数:
1.开始截取的位置的索引,包含开始索引。
2.截取结束位置的索引,不包含结束索引。
结束索引可以省略不写,就是从开始索引后全部截取。
var result = arr.slice(0,3);
arr数组的0到2的元素封装到了result数组中。
索引可以为负值:传递一个负值就是从后往前计算,-1表示倒数第一,-2表示倒数第二,以此类推。 -
splice():该方法可以用来删除数组中的指定元素,splice()方法会影响到原数组,并会将删除的元素封装到新数组中作为返回值返回,还能传递新元素,新元素自动插入到开始位置索引的前面。
两个参数:
第一个参数:开始位置的索引。
第二个参数:要删除的数量。
第三个参数及更多参数:要添加的新元素。
var result=arr.splice(1,0,6,9);表示不删除元素,将6和9添加到索引1前面
-
concat():该方法可以连接两个或多个数组(元素),并将新的数组返回(不会影响原数组)
var result = arr.concat(arr1,arr2,"元素一","元素二");这里把arr,arr2,arr3以及两个元素合并成了一个新数组赋值给了result。
-
join():该方法可以将一个数组转化为一个字符串,其不会对原数组产生影响,而是会返回一个转化后的字符串。
join()可以指定一个字符串作为参数,作为每个元素连接成字符串时的连接符,参数为空就默认为逗号。
var arr=[1,2,3,4,5,6,7];
var result=arr.join("@@");
console.log(result);
-
reverse():该方法可以用来反转数组,顺序倒置。其会直接修改原数组。
使用方法:arr.reverse();
-
sort():该方法可以用来对数组进行排序,默认使用unicode编码进行排序。
注意:使用sort()时,因为它即使是对纯数字进行排序也是使用Unicode编码进行排序,所以容易出现错误(1=11)。这个时候(数字排序时)我们要自己指定排序规则。
方法:在sort()中添加一个回调函数,来指定排序规则,回调函数要有两个形参。例如:sort(a,b),浏览器将会分别使用数组中的元素作为实参去调用函数。使用哪个元素不确定,但是在数组中,a一定比b要在前。
原理:浏览器会根据回调函数的返回值来决定元素的顺序。
1.返回大于0的值(即认为a大于b),元素交换位置
2.返回值等于0(即认为a等于b),元素不交换位置
3.返回值小于0(即认为a小于b),元素不交换位置
var arr=[8,5,1,3,2,4,6,7,9];
arr.sort(function(a,b){
// 方法一
// if(a>b){
// return 1;
// }
// else if(a<b)
// {
// return -1;
// }
// else
// {
// return 0;
// }
// 方法二
return a-b;//推荐
});
console.log(arr);
要是想变成从大到小排序,按照原理修改即可。
4.遍历数组
一般是使用for循环(for(var i=0;i<arr.length();i++){}
)
这里说下内置函数forEach();
forEach()方法需要一个函数(这个函数由我们创建但是不由我们调用,称为回调函数)作为参数。
- 数组有几个值函数就会执行几次,每次执行时,浏览器都会将遍历到的元素以实参的形式传递进来,我们要定义形参来读取这些内容。
- 浏览器会在会在回调函数中传递三个参数。
第一个参数:当前遍历到的元素;
第二个参数:当前遍历到的索引;
第三个参数:正在遍历的数组,直接就是数组。 - 兼容性:forEach方法只被ie8以上浏览器支持,如果要兼容ie8及以下浏览器,还是使用for循环来遍历。
var arr=[1,2,3,4,5,6];
arr.forEach(function(a,b){
console.log("索引值为:"+b+" 值为:"+a);
});
**注意:使用delete命令delete arr[1]
删除数组元素后,会产生空位,length属性不会过滤空位,forEach方法和for…in 结构和Object。keys方法进行遍历时会跳过空位。 **
5.类数组
类数组和数组类似,可以使用length,且其键名也为纯数字,但不能使用数组的forEach()方法等等。
function args(){
return arguments;
}
var arrayLike=args('a','b');//类数组
// 使用slice使类数组变为数组
var arr=Array.prototype.slice.call(arrayLike);
console.log(arr instanceof Array);//true
//使用call将forEach嫁接到类数组中
function print(value,index){
console.log(index+':'+value);
}
Array.prototype.forEach.call(arrayLike,print);