JS数组

203 阅读3分钟

不是典型的数组

  • 典型的数组:元素的数据类型相同,使用连续的内存存储,通过数字下标获取元素
  • JS数组:元素的数据类型可以不同,内存不一定是连续的(对象是随即存储的),不能通过数字下表而是通过字符串下标

这意味着数组可以有任何key,比如:

let arr = [1,2,3]
arr['xxx'] = 1

创建一个数组:

  • 新建:
let arr = [1,2,3]
let arr = new Array(1,2,3)
let arr = new Array(3)
  • 转化
let arr = '1,2,3'.split(',')
let arr = '123'.split('')
Array.from('123')
  • 伪数组
let divList = document.querySelectorAll('div')

伪数组的原型链中并没有数组的原型,它的原型直接指向了对象的原型

创建一个数组:

  • 合并两个数组,得到新数组 arr1.concat(arr2) //返回一个新数组
  • 截取一个数组的一部分
arr1.slice(1) //从第二个元素开始
arr1.slice(0) //全部截取
注意,JS只是提供浅拷贝

增删改查:

删元素:

  • 跟对象一样:
let arr = ['a','b','c']
delete arr['0']
arr // [empty,'b','c']
神奇,数组的长度并没有变化
  • 如果直接改length可以删元素么
let arr = [1,2,3,4,5];
arr.length = 1
注:不要随便改length

  • 删除头部元素
  • arr.shift() //arr被修改,并返回被删元素
  • 删除尾部的元素
  • arr.pop() //arr被修改,并返回被删元素
  • 删除中间的元素
arr.splice(index,1) //删除index的一个元素
arr.splice(index,1,'x')//并在删除位置添加'x'
arr.splice(index,1,'x','y') //并在删除位置添加'x','y'

查看所有元素:

  • 查看所有属性名
let arr = [1,2,3,4,5];arr.x = 'xxx'
Object.keys(arr)
for(let key in arr){console.log(`${key}:${arr[key]}`)}
  • 查看数字(字符串)属性名和值
for(let i = 0; i < arr.length ; i++){
    console.log(`${1}:${[i]}`)
}
  • 你要自己让i0增长到length - 1
arr.forEach(function(item,index){
    console.log(`${index}:${item}`)
}) //遍历这个数组,每次都调用这个函数

也可以用 forEach / map 等原型上的函数

注:上面两种方法的区别:

  • for内部有breakcontinue时,forEach是不支持的.
  • for循环是关键字,不是函数,所以其中没有函数作用域,只有块级作用域;而forEach是个函数,只有函数作用域
function forEach(array,fn){
    for(let i = 0 ; i < array.length ; i++){
        fn(array[i], i, array)
    }
}
  • forEach用for访问array的每一项

  • 对每一项调用fn(array[i],i,array)

  • 为什么要传入array?

  • 查看单个属性,跟对象一样:

  • let arr = [1,2,3]; arr[0]

  • 索引越界

  • arr[arr.length] === undefined

  • arr[-1] === undefined

  • 举例

for(let i = 0; i < arr.length ; i++){
    console.log(arr[i].toString())
} //报错:Cannot read property 'toString' of undefined
  • 查找某个元素是否在数组里
  • arr.indexOf(item) //存在返回索引,否则返回-1
  • 使用条件查找元素
  • arr.find(item => item % 2 === 0) //找第一个偶数
  • 使用条件查找元素的索引
  • arr.findIndex(item => item % 2 === 0) //找第一个偶数的索引

增加数组中的元素

  • 在尾部加元素
  • arr.push(newItem) //修改arr,返回新长度
  • arr.push(item1,item2) //修改arr,返回新长度
  • 在头部加元素
  • arr.unshift(newItem) //修改arr,返回新长度
  • arr.unshift(item1,item2) //修改arr,返回新长度
  • 在中间添加元素
  • arr.splice(index,0,'x') //在index处插入'x' ,在index位置什么都不删(0),加入'x'
  • arr.splice(index,0,'x','y')

把字符串反转:现转换为数组再合并为字符串;

数组排序;

数组变换:

  • map:n变n(一一映射)
  • filter:n变少
  • reduce:n变1

改表示数组各元素求和过程,reduce表示对它进行压缩,默认的初始值是0,每一次对取得的每一项,将项内两数相加,得到的值作为下一次的结果。