一、数组的基本概念
JS的数组不是典型数组典型的数组,只是用对象 key 和 value 模拟数组
典型的数组:
- 元素的数据类型相同
- 使用连续的内存存储
- 通过数字下标获取元素
JS的数组
- 元素的数据类型可以不同(数字、字符串、地址)
- 内存不一定是连续的(对象是随机存储的)
- 不能通过数字下标,而是通过字符串下标
- 这意味着数组可以有任何key
比如let arr=[1,2,3]
arr['xxx']=1,就会有一个下标围为 ‘xxx’的key值为1
定义一个数组:
- let arr = [1,2,3]
- let arr = new Array [1,2,3] 元素为123
- let arr = new Array(3)长度为3
转化
- 通过字符串创建数组:
let arr = '1,2,3'
arr.split(',') 得到[1,2,3]
split 是用来括号中的东西来分割字符串 - let arr = '123'.split('') 如果没有,用空字符串分割也得到[1,2,3]
- Array.form('123')
Array.from从哪得到一个数组 把不是数组的东西尝试变成数组
只是在某种条件(length和下标)下才能,如:字符串可以,数组、数字、布尔不可以
对象在有length属性时才可以,会根据length创建数组(三个元素length2 会自动删除一个)
伪数组
伪数组的原型链中没有数组的原型
- 真数组:let arr = [1,2,3]
arr.-proto- === Array.prototype - 伪数组:let arr1 = [0:'1',1:'2',2:'3',length:'3']
arr.-proto- === Object.prototype
伪数组没用 见到变成真即可
- 比如 let divList = doucment.querySelectorALL('div')
- 获取所有的div 得到的就是一个伪数组,querySelector只是帮你创建对象,push、pop等都不能用
- 变为真:let divArray = Array.form(divList)
合并、截取数组
合并:
arr1.concat(arr2):合并两个数组得到新数组,不会改变原来数组。
截取:
arr1.slice(1)//从第二个元素开始截取
arr1.slice(0)//全部(经常用于复制数组)
注意:JS只提供浅拷贝
二、对象中元素增删改查
1、删除
用对象的删除方法(不靠谱)
let arr = 【‘a’ 'b' 'c'】
delete arr['0']
arr // [empty,'b','c']
数组长度没变化
这种只有长度但是没有对应的下标的数组叫做稀疏数组(没啥用的一个东西)。

如果我修改数组的length(不靠谱)
let arr = 【‘a’ 'b' 'c'】
arr.length = 1得到arr = ['a']
对象的删除元素方法
- 删除头部元素:arr.shift()
arr被修改返回被删除元素 - 删除头部元素:arr.shift()
arr被修改返回被删除元素 - 删除中间元素:
arr.splice(index,1,'x','y')
从下标为index的元素开始删除,1就是删除一个,并在删除位置添加'x','y'.
2、查看
用对象方法查看属性名和值(不靠谱)
- let arr = [1,2,3,4,5]; arr.x = 'xxx'
Object.keys(arr) ["0"."1","2","3","4","x"]
Object.values(arr)["1","2","3","4","5","xxx"] - for in 查看
for(let i in arr){console.log(i)}
用循环
- for(let i = 0;i<arr.length;i++){console.log(
${i}:${arr[i]})},这样就不会把x打印出来(x不算length里)
模板字符串用法如上 记住 - forEach接受一个函数 函数可以遍历每一项(数组提供的方法,这是一个回调)
arr.forEach(function(item,index){
console.log(${index}:${item})}
})
forEach原理
遍历这个数组每一次都掉用这个函数

用for循环和foreach 的区别
- 大部分情况下通用 只有for循环里有 break 和continue 的时候 forEach 不支持必须走到尾
- for循环是关键字 不是函数 没有函数作用域 只有块级作用域
- foreach是一个函数 所以它是一个函数作用域
查看单个属性
- 同对象
let arr = [111,222,333] arr[0] - 索引越界(不存在的下标)
arr[arr.length] === undefined
arr[-1]=== undefined
Cannot read property 'toString' of undefined
读取了undefined的toString属性 - 查找某个元素是否在数组中
arr.indexOf(item)存在返回索引,否则返回-1 - 使用条件查找元素 find
arr.find(item => item%2===0)//找到第一个偶数
只要某一次返回true马上停止并返回元素 - 使用条件查找元素的所用
arr.findIndex(item => item%2===0)//找到第一个偶数索引
3、增加数组中的元素
在尾部添加元素
arr.push(newItem)
arr.push(item1,item2)//修改arr,返回新长度
在头部添加元素
arr.unshift(newItem)
arr.unshift(item1,item2)//修改arr,返回新长度
在头部添加元素
arr.splice(index,0,'x','y')在index处插入'x'
3、修改数组中的元素
arr.splice(index,1,'x')把index改为'x'
arr[index] = x
修改顺序
反转顺序
arr.reverse()//修改原数组
经典面试题 一个字符串如何反转顺序
join() 方法用于把数组中的所有元素放入一个字符串。

自定义顺序
sort方法:从小到大

sort方法:我想自己定义谁大 比如排名,不想用sort再reverse。我可以改变1和-1来控制

对象数组排序:
let arr[{name:'小明',score:99},{name:'小fg',score:55},{name:'小s',score:77} ]


三、数组转换(map、filter、reduce)

- map n变n
- filtern变少
- reduce n变1
这三个都是生成新数组不改变原来的
arr.map(一一映射)
复杂写法

使用map写好映射关系即可

arr.filter

arr.reduce
0是默认的初始值 第一次 0 和1 加起来 return 成为新的初始值 然后继续

arr.reduce替换map

arr.reduce替换filter

