读书笔记:JavaScript——Array类型

一、数组创建
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()可同时将前面数组项遍历产生的结果与当前遍历项进行运算,这是与迭代方法不同的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值