学习内容:
一、数组
1.数组的定义
数组是可以用来保存任意类型的数据集合
(1)用构造函数的方式实现
var a1=new Array() "空"数组
(2)直接量实现
var a2=[] "空"数组
2.数组的数据操作
(1)a1[0] 赋值
var a1=[]
a1[0]="hello"
var a1=["a","b","c"]
console.log(a1[1]) //b
(2)长度
var a1=new Array(3) 指定长度
3.数组的遍历 数组的下标由0开始
(1)for
var a1=[23,45,56,78]
for(var i=0;i<a1.length;i++){
console.log(a1[i])
}
(2)for in
var a1=[23,45,56,78]
for(var i in a1){
console.log(a1[i])
}
4.数组的添加与删除
push() 入栈,数组尾部增加数据,对原数组进行修改,返回的是修改后的数组长度
pop() 出栈,删除数组尾部的一个元素,对原数组进行修改,返回的是被删除的元素
unshift() 在数组的头部增加元素,对原数组进行修改,返回修改后数组的长度
shift() 删除数组头部的一个元素,对原数组进行修改,返回的是被删除的元素
二、数组的操作方法
1.reverse 对原数组进行反转,不会创建新数组
var a1=[23,12,56,34]
console.log(a1) //[23,12,56,34]
console.log(a1.reverse()) //[34,56,12,23]
console.log(a1) //[34,56,12,23]
2.join 可以指定分隔符,将数组转换为字符串,生成新的字符串
var a1="he,ll,oo,mm"
//字符串转数组
var a2=a1.split(",") //[he,ll,oo,mm]
3.concat 连接数组,将数据添加到数组的末尾
不修改原数组,生成新的数组
concat只能打散一维数组,不会打散数组中包含的数组
a1=[1,2,3]
a2=[4,5,6]
a1.concat(a2) //[1,2,3,4,5,6]
a1.concat(55,66) //[1,2,3,55,66]
a1.concat([33,88],[44,77]) //[1,2,3,33,88,44,77]
4.slice 截取子数组
(1)不修改原数组,生成新的数组
(2)a1.slice(2,4) 起始包含,终止不包含
(3)a1.slice(2) 起始到数组末尾
(4)a1.slice(-4,-2) 负数,由右到左截取
var a1=[13,34,45,67,89]
var a2=a1.slice(2,4)
console.log(a1) //[13,34,45,67,89]
console.log(a2) //[45,67]
var a2=a1.slice(2)
console.log(a2) //[45,67,89]
var a2=a1.slice(2,10)
console.log(a2) //[45,67,89]
var a2=a1.slice(-4,-2)
console.log(a2) //[34,45]
5.splice 增加和删除数组元素
splice(arg1,arg2,arg3...)
arg1---起始位置
arg2---被删除的元素个数
arg3及后面所有元素---要插入的元素
a1[1,2,3,4,5,6,7]
a2=a1.splice(2)
a1---[1,2] a2---[3,4,5,6,7]
如只有一个参数,从起始位置删除后面的所有的元素
修改原数组,返回被删除的元素
如第一个参数为负数,则从右到左查找,第二个参数为负数,当0处理
6.数组删除
splice
delete 仅删除元素的值,不能删除元素的空间,并且没有改变数组的大小
var a1=[3,4,5]
delete a1[0]
console.log(a1) //[ ,4,5]
console.log(a1.length) //3
三、字符串拼接的操作效率
var s1="hello"
var sums1=""
var arr1=[]
var begintime=new Date().getMilliseconds()
// for(var i=0;i<10000000;i++){
// sums1=sums1+s1 //耗时最多
// }
// for(var i=0;i<10000000;i++){
// sums1.concat(s1)
// }
for(i=0;i<1000000;i++){
arr1.push(s1)
}
arr1.join("")
var endtime=new Date().getMilliseconds()
alert(endtime-begintime)
**四、数组的检测
var a1=[2,3,4]
console.log(typeof(a1)) //object
1.Array.isArray(a1) //true
2.if(a1 instanceof Array){ //true
}
3.a1.constructor==Array //true
五、数组的toString()方法
所有对象都有toString() valueOf() toLocalstring()
toString() 返回数组中每个值的字符串形式,以","分隔进行拼接 数组转字符串
扩展:
//p1={"name":"zs"}
p1={"name":"zs",
toString:function(){
return "hello"
}
}
console.log(p1.toString())
六、数组的下标
var a1=[4,5,6,7]
1.a1[0] 0---下标
2.范围 大于0,小于2的32次幂减1 2^32-1
3.如下标是负数、浮点数、布尔型等,js会自动将其转换为字符串
var a1=[4,5,6,7]
console.log(a1[true]) //undefined
console.log(a1[-2]) //undefined
console.log(a1[2.3]) //undefined
4.下标是可以不断递增的表达式
七、排序
sort 数组.sort(比较函数)
比较函数:比较函数具有两个参数 f1(a,b)
函数只判断返回值,返回值大于0,a排在b的后面
返回值小于0,a排在b的前面
返回值等于0,a、b不动
八、数组函数
1.indexOf()
返回数组中第一个找到的元素的位置,不存在返回-1
2.forEach (for循环的一种)
数组.forEach(function(当前元素值,当前元素索引,数组对象本身){})
3.map 用来对数组的每一项进行遍历
数组.map(function(当前元素值,当前元素索引,数组对象本身){})
*****map和forEach区别
1.forEach只是遍历,map可以生成新数组
2.map速度比forEach快
3.map可以链式操作
4.filter 数据过滤
arr.filter(function(当前元素值,当前元素索引,数组对象){})
(1)filter返回新数组,不对原数组修改
(2)对返回"true"的结果过滤,"false"的结果忽略
5.reduce 接收一个函数作为累加器,数组中的每一个值,从左到右开始缩减最终计算为一个值
arr.filter(function(初始值,当前元素值,当前元素索引,数组对象){},初始值) 初始值可省略,非必要可不加,和函数是并列关系
6.some 判断数组是否有满足条件的元素
(1)arr.some(function(初始值,当前元素值,当前元素索引,数组对象){})
(2)函数内部,返回true,找到了满足条件的元素,则循环结束
返回false,没找到,循环继续
(3)函数的执行次数不一定等于数组的长度
7.every 检测数组中所有元素是否都满足指定条件
(1)arr.every(function(初始值,当前元素值,当前元素索引,数组对象){})
(2)有一项不满足就返回false,都满足才返回true
(3)函数的执行次数不一定等于数组的长度