JavaScript(第四节)续

110 阅读4分钟

上半节我们讲了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)//查看数组中的属性值
forlet 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等原型上的函数

  • 两者区别
  1. for循环里有break和continue
  2. forEach是一个函数,不支持break和continue,从一开始走到尾
  3. 一个是块级作用域,一个是函数作用域
  • 查看单个属性
let arr = [111,222,333]
arr['0']
111
  • 索引越界
  1. 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

  1. 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]
  • 修改数组的元素
  1. arr.splice
  2. arr[i]=item
  3. 反转顺序 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)

  1. 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]
  1. reduce
arr.reduce((sum,item)=>{
    return sun+=item
},0)