上半节我们讲了JS对象的分类中的构造函数、new、数组对象、函数对象,接下来我们继续讨论这一章节。
JS数组
数组对象
- 创建一个数组
let arr = [1,2,3]//小白写法
let arr = new Array(1,2,3)//正确写法
let arr = new Array(3)//表示声明一个长度为3的数组
- 转化
let arr = '1,2,3'.split(',')
let arr = '123'.split('')//括号内是控字符串,没有空格
Array.from('123')//表示把把一个不是数组的字符串变成数组
- 伪数组
let divList = document.querySelector all('div')
伪数组的原型链中没有数组的原型
总结:没有数组的共同属性的数组(如:push、top等)就是伪数组。
- 合并两个数组,得到一个新数组
let arr = new Array(1,2,3)
let arr2 = new Array(4,5,6)
arr.concat(arr2)
arr//[1,2,3,4,5,6]
- 截取数组的一部分
arr.splice(2)
arr//[1,2]
arr.splice(0)//可以用来复制一个完整的数组
arr//[1,2,3]
数组中元素的增删改查
- 删元素
let arr = new Array(1,2,3,4)
delete arr[1]
arr//[1,empty,3,4]
神奇,数组的长度并没有发生改变,那么这种数组就是稀疏数组;那我试试直接改他的length,会不会删除元素呢?
arr.length = 1
arr//[1]
直接把后面的元素全部删除。 注意:不要随便修改length。
以上两种删除的方式都都不推荐使用,下面我们讲讲日常工作是如何删数组的元素的。
- 删除头部元素
arr.shift() //arr被修改,并返回被删除值。
let arr = new Array(1,2,3,4,5,6)
arr.shift()
1
arr//[2,3,4,5,6]
- 删除尾部元素
arr.pop()//arr被修改,并返回被删除值。
arr.pop()
6
arr//[2,3,4,5]
- 删除中间元素
arr.splice(index,1)//删除index的一个元素(index=下标)
arr.splice(1,1)
arr//[2,4,5]
arr.splice(1,2)
arr//[2]
arr.splice(index,1,'x')//表示在删除的同时从该下标处增加一个元素x
let arr = [1,2,3,4,5,6,7,8]
arr.splice(2,1,'x')
arr//[1,2,'x',4,5,6,7,8]
arr.splice(3,1,'y','z')//同理,我们删除一个同时也可以增加两个元素
arr//[1,2,'x','y','z',5,6,7,8]
- 查看元素
查看属性名
let arr = [1,2,3,4,5]
arr.x='xxx'
arr//[1,2,3,4,5,'xxx']
Object.keys(arr)//查看数组中的属性名
Object.valuse(arr)//查看数组中的属性值
for(let valuse in arr){console.log(i)}//这种方式可以直接把属性名和属性值同时都打出来
- 查看数字(字符串)属性名和值
for(let i =0,i<arr.Length;i++){
console.log(`${i}:${arr[i]}`)
}
for循环需要让i从0增长到length-1
arr.forEach(function(item,index){
console.log(${index}:${item})
})
也可以用forEach/map等原型上的函数
- 两者区别
- for循环里有break和continue
- forEach是一个函数,不支持break和continue,从一开始走到尾
- 一个是块级作用域,一个是函数作用域
- 查看单个属性
let arr = [111,222,333]
arr['0']
111
- 索引越界
- arr.[arr.length]===undefined
let arr = [1,2,3,4,5]
for(let i=0,i<=length;i++){
console.log(arr[i].toString())
}
当i=5时,他对应的值就是undefined。所以会报错: cannot read property'toString'of undefined
- arr[-1]===undefined
- 查找某个元素是否在数组里
arr.indexOf(item)//存在返回下标,不存在返回-1
- 使用条件查找
arr.find(item=>item%2===0)//找到一个偶数
arr.findIndex(item=>item%2===0)//找到一个偶数,返回其下标
- 增加数组中的元素
不推荐使用arr[i]=item 正确的方式
1.在尾部加元素
arr.push(new item)//修改arr,返回新长度
let arr = [1,2,3,4,5]
arr.push(6)
arr//[1,2,3,4,5,6]
arr.push(7,8)
arr//[1,2,3,4,5,6,7,8]
2.在头部加元素
arr.unshift(new item)//修改arr,返回新长度
arr.unshift(0)
arr//[0,1,2,3,4,5,6,7,8]
arr.unshift(-2,-1)
arr//[-2,-1,0,1,2,3,4,5,6,7,8]
3.在中间添加元素 arr.splice(index,0,'x')//在index处插入'x'
arr.splice(3,0,'x')
arr//[-2,-1,0,'x',1,2,3,4,5,6,7,8]
arr.splice(4,0,'y','z')
arr//[-2,-1,0,'x','y','z',1,2,3,4,5,6,7,8]
- 修改数组的元素
- arr.splice
- arr[i]=item
- 反转顺序 arr.reverse()//修改原数组
let arr = [1,2,3,4]
arr.reverse()
arr//[4,3,2,1]
- 经典面试题 将'abcde'变成'edcba'
;let s = 'abcde'
s.split('')
s.split('').reverse()
s.split('').reverse().join('')
s//'edcba'
- 自定义顺序 arr.sort((a,b)=>a-b)
let arr = [5,3,2,4,1]
arr.sort()
arr//[1,2,3,4,5]
如果将上面的数组进行排名次,
arr.sort(function(a,b){
if(a>b){
return -1
}else if(a===b){
return 0
}else if(a<b){
return 1
}
}
arr//[1,2,3,4,5]
-数组变化(map、filter、reduce)
- map
let arr = [1,2,3,4,5]
arr.map(item=>item*item)
arr//[1,4,9,16,25]
2.filter
arr.filter(item=>item%2===0?ture:false)
arr//[2,4]
- reduce
arr.reduce((sum,item)=>{
return sun+=item
},0)