Array(数组)是javascript中复杂的数据类型,同时,Array也是内建的一个核心类,一个数组就是Array类的一个实例,可以使用Array类的方法和属性操作数组。
需要记住的是,与其他语言相比,javascript数组中的元素不必为相同的数据类型,可以在数组每个元素上混合使用数字、日期、字符串、Object,甚至添加一个嵌套数组。
实质上,Array是一系列项目的集合,其中的项目也被称为元素,可以使用索引来访问。
————《javascript权威指南》
1. 创建数组
1.1 创建数组的方法
Array类的构造方式有三种,分别是:
new Array();
new Array(length);
new Array(element0,element1,element2…elementN);
例如:
var a = new Array();
var b = new Array(3);
var c = new Array(“one”,”two”,”three”);
数组的第一个元素的索引总是0,在使用第2种方法的时候初始长度是固定的,后续添加元素的时候总长度是可以增加的。
另外,也可以使用[]来初始化数组,例如:
var array = ["one","two","three","four"];
1.2 数组的属性
- 变长数组
javascript数组的长度可以进行自动扩充,所以如果数组的初始长度确定,后续也可以根据索引值进行添加数据。 - 元素可为空
如果数组中某一个小于元素索引长度的元素未定义,那么就会为该元素自动赋值一个undefined值。
2. 数组常用API
2.1 常用方法
Array类的方法
方法 | 功能描绘 |
---|---|
concat | 连接参数并把它作为新数组返回 |
every | 对数组的每一项进行测试,直到有一项不满足指定函数,结束测试返回false;全部满足的话返回true。 |
filter | 对数组的每一项进行测试,返回一个新数组,新数组中的元素都对指定函数返回true。 |
forEach | 没有返回值,但是对数组的每一项可以进行更改 |
map | 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值,不会改变原始数组 |
some | 对数组中的只进行测试,直到返回true |
indexOf | 使用全等运算符(===)搜索数组中的项,并返回该项索引位置 |
lastIndexOf | 使用全等运算符(===)搜索数组中的项(从最后一项开始),并返回该项索引位置 |
isArray | 判断参数是否是数组 |
pop | 删除数组中的最后一个元素,并返回该元素值 |
push | 把一个或多个元素添加到数组的末尾并返回新数组的长度 |
shift | 删除数组的第一个元素,并返回该元素的值 |
unshift | 把一个或多个元素添加到数组的开端并返回数组的新长度 |
reserve | 反转数组元素 |
slice | 截取数组中的一个片断,并把该片段作为新数组返回 |
splice | 向数组中添加或移除元素 |
toString | 返回一个字符串数据,使用逗号隔开各元素 |
sort | 对数组元素进行排序 |
join | 把数组的所有元素放入一个字符串。 |
2.2 方法示例
- every()方法
//检测数组 num 的所有元素是否都大于 18 :
var num = [28, 30, 16, 11, 88, 24];
var test = num.every(function(element,index,arr){
return element>=18;
});
document.write(test);
输出结果为:
false
2. filter()方法
//检测数组 num 的所有元素是否都大于 18 :
var num = [28, 30, 16, 11, 88, 24];
var test = num.filter(function(element,index,arr){
return element>=18;
});
document.write(test);
输出结果为:
28,30,88,24
3. forEach()方法
var num = [28, 30, 16, 11, 88, 24];
num.forEach(function(element,index,arr){
arr[index] = index+"==="+element;
});
document.write(num);
输出结果为:
0===28,1===30,2===16,3===11,4===88,5===24
4. map()方法
//数组 num 的所有元素都加上 18 :
var num = [28, 30, 16, 11, 88, 24];
var test = num.map(function(element,index,arr){
return element+=18;
});
document.write(test);
输出结果为:
46,48,34,29,106,42
5. some()方法
//检测数组 num 的所有元素是否存在小于 18 的数:
var num = [28, 30, 16, 11, 88, 24];
var test = num.some(function(element,index,arr){
return element<18;
});
document.write(test);
输出结果为:
true
注:上述括号内的匿名函数function(element,index,arr),可用于every(),filter(),map(),some(),forEach() 函数中;参数 element 代表当前元素的值,必须要有;参数 index 代表当前元素的索引值,可选;参数 arr 代表当前元素属于的书租对象,可选。
6. isArray()方法
var num = [28, 30, 16, 11, 88, 24];
var str = "hi";
console.log(Array.isArray(num));
console.log(Array.isArray(str));
输出结果为:
true
false
7. indexOf() 和 lastIndexOf()方法
var num = [88, 30, 16, 11, 88, 24];
console.log(num.indexOf(88));
console.log(num.lastIndexOf(88));
输出结果为:
0
4
8. slice()方法
var num = [88, 30, 16, 11, 88, 24];
console.log(num.slice(2,5));
console.log(num);
输出结果为:
Array [ 16, 11, 88 ]
Array [ 88, 30, 16, 11, 88, 24 ]
slice()方法不会改变原数组。
9. splice()方法
var num = [88, 30, 16, 11, 88, 24];
num.splice(2,0,"a","b","c");
console.log(num);
num.splice(2,2);
console.log(num);
num.splice(2);
console.log(num);
输出结果为:
Array [ 88, 30, "a", "b", "c", 16, 11, 88, 24 ]
Array [ 88, 30, "c", 16, 11, 88, 24 ]
Array [ 88, 30 ]
语法:array.splice(index,howmany,item1…itemN)
参数 | 描述 |
---|---|
index | 必须,规定从何处添加删除元素 |
howmany | 必须。规定必须删除多少元素,必须是数字或”0”。没有规定此参数的话会删除index后所有元素。 |
item1, …, itemX | 可选。要添加到数组的新元素 |
10. join()方法
var num = [88, 30, 16, 11, 88, 24];
console.log(num.join("-"));
console.log(num.join());
输出结果(默认是以“,”进行连接):
88-30-16-11-88-24
88,30,16,11,88,24
11. sort()方法
* 默认情况下的排序
var num = [88, 30, 2, 16,8, 11, 88, 24];
num.sort();
console.log(num);
输出结果:
Array [ 11, 16, 2, 24, 30, 8, 88, 88 ]
* 自定义排序
指定一个比较函数,那么该函数必须返回以下数值:
1. -1,表示第一个参数比第二个参数小
2. 0,表示两个参数相等
3. 1,表示第一个参数比第二个参数大
var num = [88, 30, 2, 16, 8, 11, 88, 24];
num.sort(function(a,b){
return a-b;
});
console.log(num);
输出结果:
Array [ 2, 8, 11, 16, 24, 30, 88, 88 ]
#遗留问题
array数组浅拷贝和深拷贝。