数组是什么
- 数组对象 一种特殊的对象
JS其实没有真正的数组 只是用对象模拟数组 - JS的数组不是典型数组
典型的数组:
元素的数据类型相同 使用连续的内存存储 通过数字下标获取元素
但JS的数组不这样:
元素的数据类型可能不同 内存不一定是连续的(对象是随机存储的)
不能通过数字下标,而是字符串下标 这意味着数组可以有任何Key
比如 let arr =【1,2,3】 arr【‘xxx‘】=xxx 都是可以的
数组的方法
- 创建一个数组
新建
let arr=[1,2,3] let arr=new Array(1,2,3)
let arr=new Array(3) 的意思是数组长度为3 - 转化:
let arr=‘1,2,3’ arr.split(‘,’) 就可以把字符串转化为数组
let arr=‘123’ arr.split(‘’)
Array.from(‘123’) 新语法 可以直接将括号里的内容转换为数组 但是在一些情况下 可能会需要有 下标 length才能转换 - 伪数组
let divList =document.querySelector(‘div’) 这句话的意思是获取div 以数组的形式 但是是一个伪数组 没有数组的原型 可以通过Arrat.from来把他变成数组
伪数组的原型链中并没有数组的原型
总结:没有数组共用属性的数组就是伪数组 - 创建一个数组(续)
合并两个数组得到一个新数组 但是原来的数组并不会消失或者改变
arr1.concat(arr2) - 截取一个数组的一部分
arr1.slice(1)从第二个元素开始 arr1.slice(0)全部截取 截取是包括括号里的那个
slice(0)算是拷贝 JS只提供浅拷贝 不提供深拷贝
删除数组中的元素
- delete arr[0]
arr这个的第一个会变成 empty 但是数组的长度还是三 数组的长度没有变
如果一个数组中全是empty 那么这个数组叫稀疏数组 - 直接改length可以删元素
会把数组长度以外的数组全部删掉
重要:不要随便改length - 建议使用的方法
删除头部的元素
arr.shift()arr被修改 并返回被删元素 长度也会改变
删除尾部的元素
arr.pop() arr被修改 并返回删除元素
删除中间的元素
arr.splice(index,1)删除index的一个元素 1就是删一个 2就是删两个
arr。splice(index,1,‘x‘) 并在删除位置添加一个’x‘
arr.splice(index,1,‘x‘,’y‘)并在删除位置添加’x‘,’y‘
index代表数字下标 删除包括当前数字下标
遍历数组
- for循环遍历数组
- 也可以用forEach/map等原型上的函数
arr.forEach(function(xxx,yyy){
console.log(${yyy}:${xxx})}) 代表打印出 数字下表:数字 xxx是值 yyy是属性名
- for循环和each的区别就是 for循环里有break和continue 而forEach没有 他只是个函数
for循环可以在某一个下标时停止 if break 而forEach不可以
for循环是一个关键字 块级作用域 forEach是函数作用域
查看数组
- 查看单个属性
中括号下标就行 - 读取不存在的下标 就是undefined
- 查看单个属性(续)
查找某个元素是否在数组里
arr.indeOf(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’ 中间的0代表一个也不删除
arr.splice(index,0,‘x’,‘y’)
修改数组中的元素
可以直接用arr【下标】来修改
也可以用splice把那个元素删掉 换别的
反转顺序
arr.reverse()修改原数组
自定义顺序
arr.sort((a,b=>a-b))
反转一个字符串
先用split(‘’)空字符串 把它转换为数组 然后再反转数组 然后再用join(‘’)合并起来
arr.sort() 自动把乱序变为从小到大 可以在括号里写函数 return1 -1 0 来确定如何排序
会改变数组自身
以下两种写法都可
数组变换
以下三个都不会改变原数组
map
n变n
arr.map(x=>x*x)
就可以把一个数组里的内容变成平方
filter
n变少
arr.filter(x=>x%2==0 ? true : false) 筛选偶数 后面的判断可以不要 也可以打出来
reduce
接受四个参数
- Accumulator (acc) (累计器)
- Current Value (cur) (当前值)
- Current Index (idx) (当前索引)
- Source Array (src) (源数组)
n变1
arr.reduce((sum,x)=>{return sum+x},0)
x就是arr[i] 然后0是sum的初始值