JavaScript中的Array类型极其强大,有(模拟的)栈/队列方法,重排序方法,操作方法,迭代方法,位置方法和归并方法。
Array的一些基本问题
创建数组的两种方式
- 使用构造函数
- 使用字面量
当使用构造函数构造数组时,可传入(数组长度/数组的项)。
//使用构造函数
var ins1 = new Array(2);//创建一个长度为2的数组
var ins2 = new Array('1',2);//创建一个['1',2]
//使用字面量
var ins3 = ['1',2];
如何检测数组类型
- instanceof
- Array.isArray()
instanceof的问题在于当一个页面中有多个框架时,各个框架中的Array构造函数并不相同,因此框架1中的数组实例也就不存在于框架2中Array构造函数的原型链中,这样就没法使用instanceof判断。
而Array.isArray()可以很好的判断(如果浏览器支持该方法)。
length属性的非只读性
每一个数组实例都具有一个length属性来记录数组的长度,它具有一个很大的特点,即可以进行修改,你可以通过修改它来增加或者删除元素。
var ins = [1,2,3];
ins.length = 2; //ins = [1,2];
ins[length] = 3; //ins = [1,2,3];
数组中模拟的栈/队列方法
在数组中使用如下方法可模拟栈。
pop() : 删除并返回尾部元素,
push(ele) : 在尾部加入新元素并返回修改后的长度。
在数组中使用如下方法可以模拟队列。
push(ele) : 在尾部加入新元素并返回修改后的长度,
shift() : 在数组头部删除元素并返回该元素。
在数组中使用如下方法可以模拟反向队列。
pop() : 删除并返回尾部元素,
unshift(ele) : 在数组头部加入新元素并返回修改后的长度。
注意:unshift 和 pop 的参数均可为多个。
数组中的重排序方法
reverse
reverse方法用于将当前的数组反转,此操作会改变原数组。
sort
当不对sort传参而直接调用时,此方法将数组每一项转换为字符串,按照由小到大的顺序进行排序。
var ins = [3,1,10];
ins.sort();//[1,10,3];
还可以对sort传入一个函数作为参数,函数中有两个默认的参数。
function func(value1,value2){
if(value1 > value2){
return 1; //若将value2排在前面,返回正数。
}else if(value1 < value2){
return -1; //若将value1排在前面,返回负数。
}else{
return 0; //两元素大小相等。
}
var ins = [3,1,10];
ins.sort(func);//[1,3,10]
数组中的操作方法
concat
此方法从现有数组上创建副本,然后将传入的参数加入副本(若参数为数组,将数组每一项加入;否则直接加入),最后返回副本。这意味着不会改变原数组。
slice
slice对数组进行切割,返回切割所得的副本,同样不会影响原数组。
slice的第一个参数为起始位置,第二个(可选)参数为结束位置。
splice
splice(起始位置,删除的项数,插入的项*)
此方法会改变原数组,它的返回值是被删除项组成的数组。
var ins = [1,2,3,4];
ins.splice(1,1); //[1,3,4]
ins.splice(0,0,5,6)//[5,6,1,3,4]
位置方法
indexOf(ele,start?)
lastIndexOf(ele,start?)
迭代方法
迭代方法( 函数 (数组项值,索引,数组本身),作用域?)
包括:
- every:当每一项都返回true时,返回true。
- some:包含任意一项返回true的项时,返回true。
- forEach:对每一项执行指定的操作,无返回值。
- map:返回数组,它的项为对数组每一项执行函数后的返回值。
- filter:返回数组,它的项为原数组中执行函数返回true的项。