一、数组创建
1、构造函数创建
var arr1=new Array(3)//new可省略
alert(arr1.length) //传入一个数值,则作为数组的长度
var arr2=new Array('diana')
alert(arr2.length) //传入其他类型参数,会创建包含参数值的数组
2、数组字面量创建
var arr3=[1,2,3]
alert(arr3[2])//3
arr3.length=2//等价于删除数组第三项
alert(arr3[2])//undefined
3、数组length属性的使用:
var arr4=[1,2,3]
arr4.length=4//等价于将数组长度变为4,在末尾增加一项,值为undefined
alert(arr4[3])//undefined
var arr5=[1,2]
arr5[arr5.length]=3//利用length在数组末尾添加新项
alert(arr5)//[1,2,3]
二、检测数组
1、instanceof
适用于一个全局作用域
var arr=new Array()
var obj=new Object()
alert(arr instanceof Array)//true
alert(obj instanceof Array)//false
2、isArray()
var arr=new Array()
var obj=new Object()
alert(Array.isArray(arr))//true
alert(Array.isArray(obj))//false
三、转换方法
1、数组转换为字符串
toString():调用数组每个元素的toString()方法,返回的是由数组每个值的字符串形式以逗号拼接的字符串
toLocaleString():调用数组每个元素的toLocalString()方法,根据机器的本地环境来返回字符串
valueof():返回数组本身
使用alert()方法调用数组,其实就是调用了数组的toString()方法,因为alert()接收的是字符串参数
使用如下例子区分toString和toLocaleString:
var person1={
toLocaleString:function(){
return 'a'
},
toString:function(){
return 'b'
}
}
var person2={
toLocaleString:function(){
return 'c'
},
toString:function(){
return 'd'
}
}
var people=[person1,person2]
alert(people)//b,d
alert(people.toString())//b,d
alert(people.toLocaleString())//a,c
2、join()方法
上述方法均使用逗号进行分隔,使用join传入符号参数即可使用其他分隔符
join()方法返回字符串
var arr=[1,2,null,undefined,3]//如数组项有null或undefined,则输出空字符串表示
alert(arr.join())//不传入参数,则默认使用逗号,输出1,2,3
alert(arr.join(''))//参数为'',则输出123
alert(arr.join('|'))//参数为|,则输出1|2|3
注:上述4个方法对于数组项中的null、undefined的处理是返回空字符串
四、数组元素增/删
1、栈方法
push():末尾添加传入的参数,返回新长度
pop():末尾移除,不接收参数,返回移除的项或者说最后一项
var arr=[1,2,null,undefined,3]
var count=arr.push(4)
// alert(count)//6
count=arr.push(5)
// alert(count)//7
var item=arr.pop()
alert(item)//移除项:5
alert(arr.length)//6
2、队列方法
shift():移除数组第一项并返回该移除项,不接收任何参数
unshift():在第一项前添加任意项,并返回数组新长度
上述四个对数组增/删方法的总结:
-
增项、传参、返回值为length:push()、unshift()
-
减项、无参数、返回移除项:pop()、shift()
-
数组头部操作 :shift()、unshift()
-
数组尾部操作:push()、pop()
五、重排序方法
1、reverse():将数组项反转,改变原数组,返回经过排序后的数组
var sortArr=[2,222,12,90,9]
sortArr.reverse()
alert(sortArr)//[9,90,12,222,2]
2、sort():返回经过排序后的数组
如果使用sort()方法不传入任何参数对数组进行排序,可能无法得到想要的结果,因为sort()方法实际会调用数组项的toString()方法,比较的是转换后的字符串。
所以一般会向sort()传入一个比较函数,比较函数传入2个参数,如果需要数组按从小到大顺序排列,则是第1个参数小于第2个参数,此时函数返回一个负数,反之亦然。
var sortArr=[2,222,12,90,9]
// sortArr.reverse()
// alert(sortArr)//[9,90,12,222,2]
function compare(a,b){
return a-b//从小到大
//return b-a//从大到小
}
sortArr.sort(compare)//函数compare作为参数传递给sort()方法,所以此处不加括号()
alert(sortArr)//[2,9,12,90,222]
六、操作方法
1、concat():将传入的参数拼接到数组并返回一个拼接后的新数组(一维),不改变原数组
var arr1=[1,2,3]
var arr2=arr1.concat(4,[5,6])
alert(arr1)//[1,2,3]
alert(arr2)//[1,2,3,4,5,6]
2、slice():返回截取的新数组,可传1或2个参数(数值),第一个代表截取的起始项索引,第二个代表结束项索引,但不包括结束项(左闭右开);如果只有一个参数,则返回从第一个参数位置到最后一项的数组;如果参数为负值,则从右往左数;如果结束项小于起始项,则返回空数组
var arr=[1,2,3,4,5]
alert(arr.slice(1,4))//[2,3,4]
alert(arr.slice(2))//[3,4,5]
alert(arr.slice(-2,-1))//[4],等价于slice(3,4)
alert(arr.slice(2,1))//空
alert(arr.slice(-2,-3))//空
3、splice():可删除/插入数组项,返回删除项组成的数组,至少需要2个参数
- 删除数组项——需传入2个参数:起始位置索引值和删除项个数,返回被删除项组成的数组
var arr=[1,2,3]
var removed=arr.splice(1,1)
alert(removed)//[2]
alert(arr)//[1,3]
- 插入数组项——需传入3个参数:插入位置索引值、0、插入项的值(可插入多个),返回空数组(因为没有删除任何项)
在上面数组的操作基础上继续操作:
removed=arr.splice(0,0,4,5)
alert(removed)//空
alert(arr)//[4,5,1,3]
- 替换——即删除的同时插入,需传入3个参数:删除位置索引值、删除项个数、插入项值(可插入多个),返回删除项组成的数组
在上面数组的操作基础上继续操作:
removed=arr.splice(arr.length-1,1,6)
alert(removed)//[3]
alert(arr)//[4,5,1,6]
七、位置方法
indexOf()和lastIndexOf()
传入2个参数:查找项、查找起点位置索引(可选)
var arr=[1,3,5,3,1]
alert(arr.indexOf(3))//1
alert(arr.lastIndexOf(3))//3
alert(arr.indexOf(3,1))//1,从起始位置开始,包括起始项
alert(arr.indexOf(3,2))//3
在比较参数时实际使用全等操作符,因此必须严格相等
var person1={name:'diana'}
var person2=[{name:'diana'}]
var people=[person1]
alert(people.indexOf(person2))//-1
alert(person2.indexOf(people))//-1
alert(people.indexOf(person1))//0
JavaScript认为两个对象实例永远不相等,因此使用位置方法返回-1
八、迭代方法
每个方法都传入2个参数:对数组每一项运行的函数和该函数运行作用域对象(可选)
函数内可传入3个参数:数组项值、数组项的索引、数组对象本身
1、every():返回true/false,必须所有项都返回true才会最终返回true
数组每一项都执行这个函数,最后返回
var arr=[1,3,5,88,2,0]
var res=arr.every(function(item,index,array){
return item>0
})
alert(res)//false
2、some():返回true/false,只要有任一项返回true就返回true
数组项一旦运行出结果true,将不再继续向下执行,退出迭代
var res=arr.some(function(item,index,array){
return item<10
})
alert(res)//true
3、filter():对数组每一项运行给定函数,返回项为true的数组项组成的新数组被返回;用来筛选查询某些符合条件的数组项时
var res=arr.filter(function(item,index,array){
return item>5//[88]
return index>0//[3,5,88,2,0]
return array.length>3//整个数组
})
alert(res)
4、map():对数组每一项运行给定函数,返回运行结果组成的新数组,适合创建一个包含项与已知数组一一对应的数组
var res=arr.map(function(item,index,array){
return item+1
})
alert(res)//[2,4,6,89,3,1]
5、forEach():对数组每一项运行给定函数,无返回值组
arr.forEach(function(item,index,array){
item++
console.log(item)//[2,4,6,89,3,1]
})
alert(arr)//[1,3,5,88,2,0]
九、归并方法
reduce()和reduceRight()
2个参数:每一项调用的函数和作为归并基础的初始值(可选)
调用函数可传入4个参数:前一个值、当前值、当前项索引值、数组对象本身
函数每次都返回一个运行结果,作为第一个参数(prev)传给下一项直至迭代完毕
var res=arr.reduce(function(prev,curr,index,array){
return prev+curr
})
alert(res)//99
var res=arr.reduce(function(prev,curr,index,array){
return prev+curr
},2)
alert(res)//101——当reduce()的第二个参数传入初始值2,则作为函数的第一个参数prev的值,index从0开始
一个使用reduce()方法对数组去重的例子:
var arr = [1,1,2,2,99,0,12,12]
var res = arr.reduce(function(prev,curr){
// if(prev.indexOf(curr)<0){
// prev.push(curr)
// }
prev.indexOf(curr) === -1 && prev.push(curr)//由于 && 运算符一定会顺序执行左右两边的表达式,这样写可简化代码
return prev
},[])//传入的空数组作为函数第一个参数prev,对第二个参数curr(数组第一项)进行查找,如果未找到则把这项添加到新数组中
alert(res)//[1,2,99,0,12]
reduce()可同时将前面数组项遍历产生的结果与当前遍历项进行运算,这是与迭代方法不同的