一、回顾
    1、转换为字符串,不改变原数组,返回新数组。
    (1)toString(),将数组元素转换成字符串后,用’ , ‘拼接起来。
    (2)Array.prototype.join(),用传入的参数将元素拼接成字符串并返回。默认用’ , ‘拼接。
    (3)将字符串转化为数组。String.prototype.split()。根据传入的分隔符,将字符串分割,并以数组形式返回。
    2、在头部、尾部添加新元素。改变原数组,返回新数组的长度。
    (1)push,将参数作为元素添加到数组尾项。
    (2)unshift,将参数从数组头部添加进数组。
    3、在头部、尾部删除元素。改变原数组,返回删除的元素。
    (1)pop,删除数组尾项。
    (2)shift,删除数组首项。
    4、截取数组部分,不改变元素组,返回截取部分。
    (1)slice,
    start截取开始位置 可正可负
    end截取结束位置(不包含该元素),省略的话,则截取到元素尾项。Array.prototype.slice.call( arguments )类数组截取所有元素,并以数组形式返回。
    5、增删改查数组,返回删除的部分
    split,
    start 删除开始位置
    deleteCount 删除元素个数, 如果省略,start后的所有元素会被删除。
    item1, …… , itemN 新增的元素
    6、排序, 改变元素组
    (1)reverse 反序
    (2)sort()接受排序函数
    默认将元素转换为字符串后进行排序(比较unicode码)
    正序、倒叙、乱序都行
    7、查找元素是否存在于数组中
    (1)indexOf,返回元素第一次出现在数组中的索引,不存在则返回-1
    (2)lastIndexOf,返回元素最后一次出现在数组中的所以,不存在则返回-1
    (3)find(),接受一个判断函数,返回满足判断函数的第一个元素
    (4)findIndexOf(),接受一个判断函数,返回满足函数的第一个元素的索引,不存在则返回-1
    未回忆起来
    (5)includes,判断是否包含相应元素,返回boolean值。
    8、Array.prototype.fill 填充数组,改变原素组,返回改变后的数组。
    val 填充的值
    start,填充开始位置
    end,填充结束位置,不包含该位置
    9、类数组转换为数组的三种方法。
    (1)Array.prototype.slice.call()
    (2)拓展运算符 [ …arguments ]
    (3)Array.from,构造函数静态方法(没有写在原型对象上,函数自身的方法)

    10、合并数组
    (1)concat, 合并数组
    参数可以是数组,也可以是其他类型值,可以是多个参数。
    返回合并后的新数组。不能直接用Array.prototype.push.call来模拟。
    未回忆起来
    (2)拓展运算符
    […arr1, …arr2]
    11、创建数组
    (1)Array() 创建数组,参数为单个number,创建length为number的空数组
    (2)Array.of() 以参数为元素创建数组
    (3)Array.from()将类数组转化为数组

    二、数组遍历方法

    (1)for … in是为遍历对象属性而构建的,数组可以用Array.prototype.forEach()和for … of

    (2)forEach,每个元素执行一次函数,没有返回值(即使函数中写了return)
    callback,元素执行的函数
    val,当前元素
    index,当前元素的索引
    arr,当前循环的元素
    thisarg,用作函数中this的值

    1. let obj = {
    2. a:'a',
    3. name:'obj',
    4. arr: [1,2,3],
    5. fn: function(){
    6. this.arr.forEach(function(item,index,arr){
    7. console.log(item,index,arr, this)
    8. }, this )
    9. //不想指定callback中this的话,可以将callback写成箭头函数(定义时,已经绑定this)
    10. }
    11. }
    12. obj.fn()

    forEach与this的对比
    (1)forEach不会遍历空数组和稀疏数组空值部分,for循环会遍历到空值部分。

    1. let arr = [1,,3];
    2. arr.forEach((item,index,arr)=>{
    3. console.log(item,index,arr,this)
    4. },this)
    5. for(var i = 0 ;i < arr.length; i++){
    6. console.log(arr[i])
    7. }

    (2)forEach中不能使用 break和continue,for循环中可以
    for循环的遍历能更好的控制。

    对类数组调用forEach,可以直接将类数组转化为数组,也可以call,Array.prototype.forEach.call( arguments )
    [ …arguments ].forEach( ( item )=>{ console.log(item) } )更方便

    1. function(...arg){
    2. [ ...arg ].forEach()
    3. }

    3、forEach
    遍历数组,对每个元素执行传入的参数,返回新数组。如果没有返回值,默认返回undefined。如果不打算使用返回的数组,请使用forEach或者for…of

    4、filter
    遍历数组,返回通过测试函数的元素。
    过滤数据

    1. let arr = [1,5,-1,0,undefined,null];
    2. function isNumber(num){
    3. return num != null
    4. //undefined == null and undefined == undefined andd null == null 都为true
    5. //udefined 和 null与其他值都不相等
    6. }
    7. console.log(arr.filter((item)=>{
    8. return isNumber(item)
    9. })

    5、some - every
    some,遍历元素,只要有一个元素通过测试函数,返回true
    every,遍历元素,只要有一个元素不通过测试函数,返回false。

    6、遍历元素,对每个元素执行reducer函数,将结果汇总为单个值进行返回(返回任意类型的结果)。
    参数
    (1)reducer函数
    reducer接受四个参数
    (1)accumulator,累计器
    (2)当前元素
    (3)当前元素索引
    (4)正在遍历的数组
    (2)initialValue,累计器初始值。可选
    如果有initialValue,则将作为accumulator原始值,从数组首个元素开始执行reducer函数。
    如果没有initialValue,则将数组第一位元素作为accumulator原始值,从后一位元素开始遍历执行reducer函数。
    使用场景,
    (1)累加
    比起forEach,可以省掉一个用来保存数据的临时变量。
    (2)二维数组转换为一维数组

    1. let arr = [1,2,3,[4,5,6,]]
    2. console.log(arr.reduce((accumulator,ele)=>{
    3. if(Object.prototype.toString.call(ele) === '[object Array]'){
    4. return [...accumulator, ...ele]
    5. }else{
    6. return [...accumulator,ele]
    7. }
    8. },[]))

    (3)记录数组中元素出现的次数,可以将initialValue设为一个空对象,每次执行reducer的时候,条件性的修改记录对象并返回作为累计器。